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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CF827F-Dirty Arkady‘s Kitchen【堆】

發(fā)布時(shí)間:2023/12/3 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CF827F-Dirty Arkady‘s Kitchen【堆】 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

正題

題目鏈接:https://www.luogu.com.cn/problem/CF827F


題目大意

給出nnn個(gè)點(diǎn)mmm條邊的一張無向圖,每條邊只有在時(shí)刻[li,ri)[l_i,r_i)[li?,ri?)時(shí)候才能通過,且通過時(shí)間為111,你不能在一個(gè)點(diǎn)處停留,求111走到nnn的最短時(shí)間。

1≤n,m≤5×1051\leq n,m\leq 5\times 10^51n,m5×105


解題思路

如果能停留的話顯然我們可以停留等待一條邊開啟,儲(chǔ)存最短距離肯定最優(yōu)。

但是現(xiàn)在不能停留,考慮在一條邊處反復(fù)橫跳,而這樣我們?nèi)绻WC最優(yōu)吧一個(gè)點(diǎn)拆成一個(gè)奇點(diǎn)和一個(gè)偶點(diǎn),但是現(xiàn)在的問題是我們反復(fù)橫跳的邊是可能關(guān)閉的。

考慮把邊的lil_ili?從小到大排序來進(jìn)行考慮,當(dāng)我們枚舉到一條邊時(shí)iii如果能夠到大那么下界顯然沒有問題(也就是能夠在lll之前到達(dá)),那么考慮上界的限制,也就是我們至少需要反復(fù)橫跳到時(shí)間lll才能走這條邊。

設(shè)fif_ifi?表示目前能夠到達(dá)iii的最晚時(shí)間,那么當(dāng)l≤fil\leq f_ilfi?的時(shí)候可以直接走這條邊,否則我們需要等到以后再走這個(gè)點(diǎn)的fi≥lf_i\geq lfi?l的時(shí)候就可以了,所以我們可以把這條邊先掛在xxx上然后當(dāng)我們下次有一條邊能夠走到xxx時(shí)考慮如何處理掛在xxx上的邊。

記掛在xxx上的邊為AAA,走到xxx的邊為BBB,因?yàn)槭?span id="ozvdkddzhkzd" class="katex--inline">AAA先枚舉的顯然有Al≤BlA_l\leq B_lAl?Bl?,同樣的就有Br≤AlB_r\leq A_lBr?Al?,所以在BBB處反復(fù)橫跳一定能走AAA,所以我們可以把所有掛在xxx上的邊取下來然后把相等于能夠新走的邊加入即可。

再開一個(gè)維護(hù)目前的邊即可。

時(shí)間復(fù)雜度:O(mlog?m)O(m\log m)O(mlogm)


code

#include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<vector> #define ll long long using namespace std; const ll N=1e6+10; struct node{ll x,y,l,r; }; ll n,m,f[N]; bool operator<(node x,node y) {return x.l>y.l;} priority_queue<node> q; vector<node> e[N]; signed main() {scanf("%lld%lld",&n,&m);if(n==1)return puts("0")&0; for(ll i=1;i<=m;i++){ll x,y,l,r;scanf("%lld%lld%lld%lld",&x,&y,&l,&r);r--;q.push((node){x,y+n,l+(l&1),r-(r&1)});q.push((node){y,x+n,l+(l&1),r-(r&1)});q.push((node){x+n,y,l+!(l&1),r-!(r&1)});q.push((node){y+n,x,l+!(l&1),r-!(r&1)});}memset(f,0xcf,sizeof(f));f[1]=0;while(!q.empty()){node x=q.top();q.pop();if(x.l>x.r)continue;if(x.l>f[x.x]){e[x.x].push_back(x);continue;}if(x.y==n||x.y==2*n)return printf("%lld\n",x.l+1)&0;f[x.y]=max(f[x.y],x.r+1);for(ll i=0;i<e[x.y].size();i++){node y=e[x.y][i];y.l=x.l+1;q.push(y);}e[x.y].clear();}puts("-1");return 0; }

總結(jié)

以上是生活随笔為你收集整理的CF827F-Dirty Arkady‘s Kitchen【堆】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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