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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CF903G-Yet Another Maxflow Problem【线段树,最大流】

發布時間:2023/12/3 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CF903G-Yet Another Maxflow Problem【线段树,最大流】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題

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


題目大意

nnnAAA點,nnnBBB點,第Ai→Ai+1A_i\rightarrow A_{i+1}Ai?Ai+1?Bi→Bi+1B_{i}\rightarrow B_{i+1}Bi?Bi+1?都連有不同流量的邊,然后有mmmAi→BjA_i\rightarrow B_jAi?Bj?連邊。

qqq次修改一條Ai→Ai+1A_i\rightarrow A_{i+1}Ai?Ai+1?的邊,求最大流。

1≤n,m,q≤2×1051\leq n,m,q\leq 2\times 10^51n,m,q2×105


解題思路

首先最大流=最小割,所以我們可以求最小割。

然后這題就差不多了,左邊和右邊最多割一條,然后剩下的邊都要割掉。

先用線段樹處理每條AAA邊右邊的代價,然后左邊修改的話就用優先隊列維護一下就好了。

時間復雜度:O(nlog?n)O(n\log n)O(nlogn)n,m,qn,m,qn,m,q同級)


code

#include<cstdio> #include<cstring> #include<algorithm> #include<queue> #define ll long long #define mp(x,y) make_pair(x,y) using namespace std; const ll N=2e5+10; ll n,m,t,a[N],ans[N],w[N<<2],lazy[N<<2]; priority_queue<pair<ll,ll> > q; vector<pair<ll,ll> >E[N]; void Downdata(ll x){if(!lazy[x])return;w[x*2]+=lazy[x];w[x*2+1]+=lazy[x];lazy[x*2]+=lazy[x];lazy[x*2+1]+=lazy[x];lazy[x]=0;return; } void Change(ll x,ll L,ll R,ll l,ll r,ll val){if(L==l&&R==r){w[x]+=val;lazy[x]+=val;return;}ll mid=(L+R)>>1;Downdata(x);if(r<=mid)Change(x*2,L,mid,l,r,val);else if(l>mid)Change(x*2+1,mid+1,R,l,r,val);else Change(x*2,L,mid,l,mid,val),Change(x*2+1,mid+1,R,mid+1,r,val);w[x]=min(w[x*2],w[x*2+1]);return; } void Solve(){do{pair<ll,ll> x=q.top();if(-x.first!=ans[x.second]+a[x.second]){q.pop();continue;}printf("%lld\n",-x.first);break;}while(1);return; } signed main() {scanf("%lld%lld%lld",&n,&m,&t);for(ll i=1,x;i<n;i++){scanf("%lld%lld",&a[i],&x);Change(1,1,n,i+1,i+1,x);}for(ll i=1;i<=m;i++){ll x,y,w;scanf("%lld%lld%lld",&x,&y,&w);E[x].push_back(mp(y,w));}for(ll i=1;i<=n;i++){for(ll j=0;j<E[i].size();j++)Change(1,1,n,1,E[i][j].first,E[i][j].second);ans[i]=w[1];q.push(mp(-a[i]-ans[i],i));}Solve();while(t--){ll x,w;scanf("%lld%lld",&x,&w);a[x]=w;q.push(mp(-a[x]-ans[x],x));Solve();}return 0; }

總結

以上是生活随笔為你收集整理的CF903G-Yet Another Maxflow Problem【线段树,最大流】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。