日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

[C++ map dp]codeforces 960F. Pathwalks

發(fā)布時(shí)間:2025/3/16 c/c++ 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [C++ map dp]codeforces 960F. Pathwalks 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目傳送門(mén):960F

思路:

題目給人的感覺(jué)很像最長(zhǎng)上升子序列,自然而然想到用dp的思路去處理

題目中給的限制條件是,要接上前面的邊,前面的邊權(quán)一定要小于當(dāng)前的邊權(quán)(題目按照輸入的順序,因此只找前面的邊)

對(duì)于每個(gè)結(jié)點(diǎn),我們要維護(hù)的信息是:

  當(dāng)前狀態(tài)下,w的邊權(quán)到達(dá)這個(gè)點(diǎn),最多能有幾條邊

如何維護(hù)這個(gè)信息呢?如果對(duì)每個(gè)點(diǎn)開(kāi)一個(gè)maxn的數(shù)組,每次暴力修改,顯然是過(guò)不去的

一種處理辦法是:對(duì)每個(gè)點(diǎn)建動(dòng)態(tài)線段樹(shù)(可是本菜雞不會(huì)!!。。我馬上去學(xué)

另一種簡(jiǎn)單的處理辦法:用map以及map內(nèi)置的函數(shù)

對(duì)每個(gè)點(diǎn)建立一個(gè)map<int,int> 保存對(duì)應(yīng)邊權(quán)下,能達(dá)到的最大的邊數(shù)

vector< map<int,int> > s; ... s.resize(n+1);

?

對(duì)于每條邊(a,b,w), 查a點(diǎn)的map里,小于w 的最大的邊數(shù)

1 int get_edge_no(int a,int w){ 2 auto t = s[a].lower_bound(w); 3 if(t == s[a].begin())return 0; 4 --t; 5 return t->second; 6 }

然后得到b對(duì)應(yīng)的w的結(jié)果,再保存至b的map里

1 int t = get_edge_no(a,w) + 1; 2 if(t < get_edge_no(b,w+1))continue; 3 s[b][w] = t;

保存之后,一定要將map里w大 val小的元素刪除(因?yàn)檫@部分?jǐn)?shù)據(jù)也需要更新)

1 auto it = s[b].upper_bound(w); 2 while(it != s[b].end() && it->second < t){ 3 it = s[b].erase(it); 4 } 5 ans = max(ans,t);

完整代碼:

1 #include <bits/stdc++.h> 2 3 using namespace std; 4 #define _____ ios::sync_with_stdio(false);cin.tie(0); 5 int n,m; 6 const int maxn = 100005; 7 vector< map<int,int> > s; 8 int get_edge_no(int a,int w){ 9 auto t = s[a].lower_bound(w); 10 if(t == s[a].begin())return 0; 11 --t; 12 return t->second; 13 } 14 int main(){ 15 //freopen("data.in","r",stdin); 16 _____ 17 cin >> n >> m; 18 s.resize(n+1); 19 int a,b,w; 20 int ans = 0; 21 for(int i = 1; i <= m; i++){ 22 cin >> a >> b >> w; 23 int t = get_edge_no(a,w) + 1; 24 if(t < get_edge_no(b,w+1))continue; 25 s[b][w] = t; 26 auto it = s[b].upper_bound(w); 27 while(it != s[b].end() && it->second < t){ 28 it = s[b].erase(it); 29 } 30 ans = max(ans,t); 31 } 32 cout << ans << '\n'; 33 return 0; 34 } View Code

?

下面整理一下map里好用的內(nèi)置函數(shù):

?

?

添加元素:

?

map<typename,typename>.insert( pair<typename,typename> ); // 注意參數(shù)是pair類(lèi)型 返回一個(gè)pair類(lèi)型,first成員是一個(gè)迭代器,second成員是一個(gè)bool值,true:插入成功 false:已存在 刪除元素: map.erase( k );? 刪除關(guān)鍵字為k的元素,返回刪除的元素?cái)?shù)量 map.erase( p );
刪除迭代器p指定的元素,返回指向p之后的元素 map.erase(b,e); 刪除迭代器對(duì)b,e之間的元素,返回e 查找元素: map.upper_bound( k ); map.lower_bound( k ); 以第一關(guān)鍵字比較大小,返回一個(gè)迭代器 map.equal_range(k); 返回一個(gè)迭代器pair,表示關(guān)鍵字等于k的范圍。若不存在,都等于map.end()

?

轉(zhuǎn)載于:https://www.cnblogs.com/fanwl/p/10441124.html

總結(jié)

以上是生活随笔為你收集整理的[C++ map dp]codeforces 960F. Pathwalks的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。