bzoj4390[Usaco2015 dec]Max Flow*
bzoj4390[Usaco2015 dec]Max Flow
题意:
给定一棵有N个点的树,所有节点的权值都为0。有K次操作,每次指定两个点s,t,将s到t路径上所有点的权值都加一。请输出K次操作完毕后权值最大的那个点的权值。n≤50000,k≤100000。
题解:
先链剖把树变为链。然后用数组区间加的方式(即在数组区间左端点位置增加值,数组区间右端点+1位置增加这个值的相反数,最后扫一遍a[i]+=a[i-1])累计权值。类似bzoj3631
代码:
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define inc(i,j,k) for(int i=j;i<=k;i++) 5 #define maxn 50010 6 using namespace std; 7 8 inline int read(){ 9 char ch=getchar(); int f=1,x=0; 10 while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();} 11 while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); 12 return f*x; 13 } 14 int sm[maxn],sz[maxn],dep[maxn],fa[maxn],top[maxn],pos[maxn],n,q,ans,tot; 15 struct e{int t,n;}es[maxn*2]; int g[maxn],ess; 16 void pe(int f,int t){es[++ess]=(e){t,g[f]}; g[f]=ess; es[++ess]=(e){f,g[t]}; g[t]=ess;} 17 void dfs1(int x,int f){ 18 sz[x]=1; 19 for(int i=g[x];i;i=es[i].n)if(es[i].t!=f){ 20 fa[es[i].t]=x; dep[es[i].t]=dep[x]+1; dfs1(es[i].t,x); sz[x]+=sz[es[i].t]; 21 } 22 } 23 void dfs2(int x,int f,int tp){ 24 pos[x]=++tot; top[x]=tp; int mx1=0,mx2=0; 25 for(int i=g[x];i;i=es[i].n)if(es[i].t!=f&&sz[es[i].t]>mx1)mx1=sz[es[i].t],mx2=es[i].t; 26 if(!mx2)return; dfs2(mx2,x,tp); 27 for(int i=g[x];i;i=es[i].n)if(es[i].t!=f&&es[i].t!=mx2)dfs2(es[i].t,x,es[i].t); 28 } 29 void solve(int x,int y){ 30 for(;top[x]!=top[y];sm[pos[top[x]]]++,sm[pos[x]+1]--,x=fa[top[x]])if(dep[top[x]]<dep[top[y]])swap(x,y); 31 if(dep[x]>dep[y])swap(x,y); sm[pos[x]]++; sm[pos[y]+1]--; 32 } 33 int main(){ 34 n=read(); q=read(); inc(i,1,n-1){int x=read(),y=read(); pe(x,y);} dfs1(1,0); dfs2(1,0,1); 35 inc(i,1,q){int x=read(),y=read(); solve(x,y);} 36 inc(i,1,n)sm[i]+=sm[i-1],ans=max(ans,sm[i]); printf("%d",ans); return 0; 37 }
20160908
转载于:https://www.cnblogs.com/YuanZiming/p/5876093.html
bzoj4390[Usaco2015 dec]Max Flow*相关推荐
- 【bzoj 4390】 [Usaco2015 dec]Max Flow(树上差分)
4390: [Usaco2015 dec]Max Flow Time Limit: 10 Sec Memory Limit: 128 MB Submit: 156 Solved: 100 [Sub ...
- bzoj4393[Usaco2015 Dec]Fruit Feast*
bzoj4393[Usaco2015 Dec]Fruit Feast 题意: 奶牛一开始饱胀值为0,上限为T.每个柠檬派提供a点饱胀值,每个橘子派提供b点饱胀值,有一次机会喝水,使得饱胀值div2.柠 ...
- bzoj4396[Usaco2015 dec]High Card Wins*
bzoj4396[Usaco2015 dec]High Card Wins 题意: 一共有2n张牌,Alice有n张,Bob有n张,每一局点数大的赢.知道Bob的出牌顺序,求Alice最多能赢几局.n ...
- P3128 [USACO15DEC]最大流Max Flow
P3128 [USACO15DEC]最大流Max Flow 对,这是一道最大流的题目qwq 树上跑最大流,没错 也就是跑最小割 你看名字里都有最大流,为什么不能跑最大流qwq............. ...
- P3128 [USACO15DEC]Max Flow P
P3128 [USACO15DEC]Max Flow P 树上差分之点差分模板题 题目描述: FJ给他的牛棚的N(2≤N≤50,000)个隔间之间安装了N-1根管道,隔间编号从1到N.所有隔间都被管道 ...
- HDU 4183(max flow)
HDU 4183(max flow) 链接 题意:orz,论翻译的重要性,看了半天.进入正题: 有n(2 <= n <= 300)个圆圈,每个圆圈都有其频率f,坐标(x,y),半径r.(题 ...
- max flow value 是网络流里的什么_为什么你这么努力,还是没有通过投行面试
临近11月 想必参加秋招的同学都陆续接到了好消息 收到了面试邀请投行也迎来了面试季 又是神仙打架的日子 通过几轮的筛选 你终于进入了投行的面试 准备投行的面试得花费大量的时间和精力 想要事半功倍下面这 ...
- [LUOGU] P3128 [USACO15DEC]最大流Max Flow
题意:一棵树,多次给指定链上的节点加1,问最大节点权值 n个点,n-1条边很容易惯性想成一条链,幸好有样例.. 简单的树剖即可!(划去) 正常思路是树上差分,毕竟它就询问一次.. #include&l ...
- 洛谷 P3128 [USACO15DEC]最大流Max Flow
题意简述 给定一颗树,每次操作可以使两个点最短路上的点+1,求最大的点 题解思路 树上差分 若操作u, v,则++f[u], ++f[v], --f[lca(u, v)], --f[father(lc ...
最新文章
- C++ demo:文本搜索以及'指针的引用'的思考
- java中的接口中的方法
- html 图片能重叠吗,css两张图片怎么叠加在一起?
- 控制面板项 .cpl 文件说明
- 研发人员为什么留不住
- 小米12后壳谍照曝光:后置三摄相机模组 采用大眼瞪小眼设计
- 微信停机断网可充话费;苹果正研发可折叠屏幕 iPad;Rust 1.36.0 发布 | 极客头条...
- webbench之编译安装(一)
- Mac 开机没声音了?只需 2 招关闭/恢复Mac开机音效「咚」
- mysql可以授予的权限包括多选题_mysql中的权限有( )。 (5.0分)_学小易找答案
- (Windows)Scala学习3--列表、数组
- 常见10种自然语言处理技术
- 最详细iOS打包流程
- 10行java代码实现email代码表白感恩节必备~
- 《当程序员的那些狗日日子》(四十)繁杂的需求
- java spring登录验证_详解使用Spring Security进行自动登录验证
- 企业微信机器人脚本python_Python实现企业微信机器人每天定时发消息实例
- android 生成条码,Android -条形码的生成
- 纯js实现搜索框自动补全
- 为创业者搭建梦想舞台,让技术与创新说话|腾讯数字安全创新大赛 · 嘉宾访谈