[CF903G]Yet Another Maxflow Problem

题目大意:

有\(A\)类点和\(B\)类点各\(n(n\le2\times10^5)\)个,所有\(A_i\)到\(A_{i+1}\)有一条权值为\(a_i\)的有向边,所有\(B_i\)到\(B_{i+1}\)有一条权值为\(b_i\)的有向边,另有\(m(m\le2\times10^5)\)条从\(A_x\)到\(B_y\)的权值为有向边。连续\(q(q\le2\times10^5)\)次操作将\(A_{v_i}\)与\(A_{v_i+1}\)之间的边的权值改为\(w_i\)。问每次修改完毕后的从\(A_1\)到\(B_n\)的最大流。

思路:

根据最大流-最小割定理,题目所求相当于每次修改完毕后的最小割。定义\(A\)类点间的边为\(A\)类边,\(B\)类点间的边为\(B\)类边,\(AB\)类点间的边为\(C\)类边。假设两类边各\(n-1\)条之外还分别有一个边权为\(0\)的边,那么每次的最小割一定恰好包含一个\(A\)类边、一个\(B\)类边和若干\(C\)类边。由于\(B\)类边和\(C\)类边都不会被修改,则对于同一个\(A\)类边,对应的最优的\(B\)类边是固定的。方便起见,下文将\(B_i\)到\(B_{i+1}\)的边记作\(b_{i+1}\),不同于题面描述。

考虑预处理每个\(A\)类边对应的最优\(B\)类边。不难发现,若我们选择了\(a_i\)和\(b_j\)两条边,要使得\(A_1\)与\(B_n\)不连通,则我们还需要割去所有连接\(A_x,B_y(x\le i,y\ge j)\)的\(C\)类边,而这也是选择\(a_i\)和\(b_j\)后的最小割。反过来说,连接\(A_x,B_y\)的\(C\)类边会对\(a_i,b_j(x\le i,y\ge j)\)的选择产生影响。因此我们可以\(1\sim n\)枚举每个\(a_i\),用线段树维护对应每个\(b_j\)所需要的最小割的大小。首先将所有\(b_j\)加入到线段树中,对于当前枚举到的\(a_i\),枚举从\(A_i\)出发的所有\(C\)类边,若对应的点为\(B_j\),权值为\(w\),将区间\([1,j]\)加上\(w\),表示对于\(a_i\)及\(a_i\)以后的\(A\)类边,若还要考虑\(b_j\)及\(b_j\)以前的\(B\)类边作为对应边,一定要割去这条\(C\)类边。而每次插入后线段树最小元素就是对应当前\(a_i\),由一个\(B\)类边和若干\(C\)类边组成的、能与\(a_i\)构成割的边权和,记这一边权和为\(sum\),则选择\(a_i\)时的最小割为\(sum+a_i\),记作\(c_i\)。

考虑修改操作,由于\(a_i\)对应的\(B\)类边和\(C\)类边已经确定,每次修改时\(a_i\)的变化也就是\(c_i\)的变化。用一些数据结构维护所有\(c_i\)的最小值即可。时间复杂度\(\mathcal O((m+q)\log n)\)。

源代码:

#include<cstdio>
#include<cctype>
#include<vector>
using int64=long long;
inline int getint() {register char ch;while(!isdigit(ch=getchar()));register int x=ch^'0';while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');return x;
}
constexpr int N=2e5+1;
int64 a[N],b[N],c[N];
using Edge=std::pair<int,int>;
std::vector<Edge> e[N];
class SegmentTree {#define _left <<1#define _right <<1|1private:int64 val[N<<2],tag[N<<2];void push_up(const int &p) {val[p]=std::min(val[p _left],val[p _right]);}void push_down(const int &p) {if(!tag[p]) return;val[p _left]+=tag[p];val[p _right]+=tag[p];tag[p _left]+=tag[p];tag[p _right]+=tag[p];tag[p]=0;}public:void build(const int &p,const int &b,const int &e,const int64 arr[]) {tag[p]=0;if(b==e) {val[p]=arr[b];return;}const int mid=(b+e)>>1;build(p _left,b,mid,arr);build(p _right,mid+1,e,arr);push_up(p);}void modify(const int &p,const int &b,const int &e,const int &l,const int &r,const int64 &v) {if(b==l&&e==r) {val[p]+=v;tag[p]+=v;return;}push_down(p);const int mid=(b+e)>>1;if(l<=mid) modify(p _left,b,mid,l,std::min(mid,r),v);if(r>mid) modify(p _right,mid+1,e,std::max(mid+1,l),r,v);push_up(p);}int64 query() const {return val[1];}#undef _left#undef _right
};
SegmentTree t;
int main() {const int n=getint(),m=getint(),q=getint();for(register int i=1;i<n;i++) {a[i]=getint(),b[i+1]=getint();}t.build(1,1,n,b);for(register int i=0;i<m;i++) {const int u=getint(),v=getint(),w=getint();e[u].push_back({v,w});}for(register int x=1;x<=n;x++) {for(register auto &j:e[x]) {const int &y=j.first,&w=j.second;t.modify(1,1,n,1,y,w);}c[x]=t.query()+a[x];}t.build(1,1,n,c);printf("%lld\n",t.query());for(register int i=0;i<q;i++) {const int x=getint(),v=getint();t.modify(1,1,n,x,x,v-a[x]);a[x]=v;printf("%lld\n",t.query());}return 0;
}

转载于:https://www.cnblogs.com/skylee03/p/9087266.html

[CF903G]Yet Another Maxflow Problem相关推荐

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

    正题 题目链接:https://www.luogu.com.cn/problem/CF903G 题目大意 有nnn个AAA点,nnn个BBB点,第Ai→Ai+1A_i\rightarrow A_{i+ ...

  2. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

  3. 线段树 by yyb

    线段树 by yyb Type1 维护特殊信息 1.[洛谷1438]无聊的数列 维护一个数列,两种操作 1.给一段区间加上一个等差数列 2.单点询问值 维护等差数列 不难发现,等差数列可以写成\(ad ...

  4. [转载]Maximum Flow: Augmenting Path Algorithms Comparison

    https://www.topcoder.com/community/data-science/data-science-tutorials/maximum-flow-augmenting-path- ...

  5. HDU Problem - 6214 Smallest Minimum Cut(最小割边,两种方法)

    题目链接 Problem Description Consider a network G=(V,E)G=(V,E)G=(V,E) with source sss and sink t" r ...

  6. HDU Problem - 1533 Going Home(费用流板子题)

    题目链接 Problem Description On a grid map there are n little men and n houses. In each unit time, every ...

  7. bzoj 3218: a + b Problem

    Description Input Output Sample Input 10 0 1 7 3 9 2 7 4 0 9 10 5 1 0 4 2 10 2 7 9 1 5 7 2 6 3 5 3 6 ...

  8. 网络流--最大流--HDU 3549 Flow Problem

    题目链接 Problem Description Network flow is a well-known difficult problem for ACMers. Given a graph, y ...

  9. linux下yum错误:[Errno 14] problem making ssl connection Trying other mirror.

    所有的base 都要取消注释 mirrorlist 加上注释 另外所有的enable都要设为零 目录 今天是要yum命令安装EPEL仓库后 yum install epel-release 突然发现y ...

最新文章

  1. python视频课程推荐-听说程序员都在用,5款Python开发工具推荐
  2. 曾今的代码系列——获取当天最大流水号存储过程
  3. 一步一步学Ruby(十一):控制语句
  4. 如何卸载mysql重新安装win10_学以致用二十八-----win10安装mysql5.7.24及卸载
  5. 读书笔记 --- [基础知识点] 小结3
  6. Python传奇:30年崛起之路
  7. super和this关键字详解
  8. codeforces166E - Tetrahedron DP
  9. Ubuntu下使用UFW配置防火墙
  10. android targetapi23,Android Studio 3.0+上的Kapt问题(TargetApi)
  11. webloigc12服务启动不了_weblogic启动不能锁定AdminServer.lok的故障处理
  12. Your Bitbucket account has been locked. To unlock it and log in again you must solve a CAPTCHA.
  13. 说说看:如何把自己的导师培养成杰青?
  14. TwoStep Cluster
  15. php读取excel最佳方案,用PHP读取excel(转)
  16. python3学习笔记---类
  17. AMD Ryzen Threadripper 2990WX和intel 9980XE 用于第一性原理计算对比
  18. 2020-11-30 网络爬虫
  19. SAP ALE学习手册
  20. 用java写出杨辉三角。

热门文章

  1. python创建变量score_使用Python 3.5.1中的变量创建文件时的FileNotFoundError
  2. 获取input相同名字的元素的值
  3. [Js-开发常识]为什么定义实体类属性建议用 Ineger 而不是 int
  4. 51nod 1623 完美消除(数位DP)
  5. Android监听事件
  6. rebuild online意外终止导致ora-8104错误的实验
  7. hdu 4391 Paint The Wall 线段树 +优化 2012 Multi-University Training Contest 10 )
  8. java中filter的用法
  9. 3d翻转 ios_iOS自定义转场详解04——实现3D翻转效果
  10. 分布式机构 RPC远程过程调用