CF903G Yet Another Maxflow Problem
神奇的模拟最小割。(?)另一道类似的题
暴力流显然跑不过。考虑最大流等于最小割,考虑割去那些边使得 不连通。
一个重要的性质是 链上和 链上都最多只会删一条边。原因很显然,如果删了很多条边,可以只保留 中最靠前的边和 中最靠后的边。为了方便处理,设连接 的边编号为 ,连接 的边编号为 ,所以编号为 的边的边权为 。
如果断了 和 条边,中间的边需要断掉的是 的所有边。所以扫描线扫描断开 的边的编号,同时维护 表示假设此时断开 边的代价。
的初值即为 。当扫到一条边 时,需要做的是 前缀加 ,还需要求全局最小值,线段树维护即可,这样可以求出 表示断 条边的最小代价为 。
对于修改,就是单点修改,查询全局最大值。可以用堆维护,这里直接偷懒线段树废物再利用了/tx/tx。复杂度是 。
int n,m,q,a[200010],b[200010],v[200010];
vector<pii> ve[200010];
namespace Segment
{
#define ls(x) (t[x].l+t[x].r)
#define rs(x) ((t[x].l+t[x].r)^1)
struct{int l,r,v,tg;}t[400010];
inline void update(int x){t[x].v=min(t[ls(x)].v,t[rs(x)].v);}
inline void down(int x,int y){t[x].tg+=y,t[x].v+=y;}
inline void spread(int x){down(ls(x),t[x].tg),down(rs(x),t[x].tg),t[x].tg=0;}
void build(int p,int l,int r)
{
t[p].l=l,t[p].r=r,t[p].tg=0;
if(l==r)return t[p].v=v[l],void();
int mid=l+((r-l)>>1);
build(ls(p),l,mid),build(rs(p),mid+1,r),update(p);
}
void modify(int p,int l,int r,int x)
{
if(l<=t[p].l&&r>=t[p].r)return down(p,x);
spread(p);
if(l<=t[ls(p)].r)modify(ls(p),l,r,x);
if(r>t[ls(p)].r)modify(rs(p),l,r,x);
update(p);
}
}
using namespace Segment;
inline void mian()
{
read(n,m,q);int x,y,z;
for(int i=1;i<n;++i)read(a[i],b[i]),v[i+1]=b[i];
while(m--)read(x,y,z),ve[x].eb(mp(y,z));
build(1,1,n);
for(int i=1;i<=n;++i)
{
for(auto p:ve[i])modify(1,1,p.fi,p.se);
v[i]=a[i]+t[1].v;
}
build(1,1,n),write(t[1].v,'\n');
while(q--)read(x,y),modify(1,x,x,y-a[x]),a[x]=y,write(t[1].v,'\n');
}
分类:
题解 / CF
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现