CF903G-Yet Another Maxflow Problem【线段树,最大流】
生活随笔
收集整理的這篇文章主要介紹了
CF903G-Yet Another Maxflow Problem【线段树,最大流】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
題目鏈接:https://www.luogu.com.cn/problem/CF903G
題目大意
有nnn個AAA點,nnn個BBB點,第Ai→Ai+1A_i\rightarrow A_{i+1}Ai?→Ai+1?和Bi→Bi+1B_{i}\rightarrow B_{i+1}Bi?→Bi+1?都連有不同流量的邊,然后有mmm對Ai→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^51≤n,m,q≤2×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【线段树,最大流】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: P4700-[CEOI2011]Traf
- 下一篇: 添加各接口静态路由电脑如何添加静态路由