题意:一棵树,多次给指定链上的节点加1,问最大节点权值

n个点,n-1条边很容易惯性想成一条链,幸好有样例..

简单的树剖即可!(划去)

正常思路是树上差分,毕竟它就询问一次..

#include<iostream>
#include<cstring>
#include<cstdio>using namespace std;inline int rd(){int ret=0,f=1;char c;while(c=getchar(),!isdigit(c))f=c=='-'?-1:1;while(isdigit(c))ret=ret*10+c-'0',c=getchar();return ret*f;
}const int MAXN=500005<<2;struct Edge{int next,to;Edge(int x=0,int y=0){next=x;to=y;}
}e[MAXN];
int ecnt,head[MAXN];
inline void add(int x,int y){e[++ecnt]=Edge(head[x],y);head[x]=ecnt;
}int n,m;int fa[MAXN],dep[MAXN],siz[MAXN],hs[MAXN];
void dfs1(int x,int pre){fa[x]=pre;dep[x]=dep[pre]+1;siz[x]=1;int mx=0,tmp=0;for(int i=head[x];i;i=e[i].next){int v=e[i].to;if(v==pre) continue;dfs1(v,x);siz[x]+=siz[v];if(siz[v]>mx){mx=siz[v];tmp=v;}}hs[x]=tmp;
}int top[MAXN],id[MAXN],tot;
void dfs2(int x,int tp){top[x]=tp;id[x]=++tot;if(hs[x]) dfs2(hs[x],tp);for(int i=head[x];i;i=e[i].next){int v=e[i].to;if(v==fa[x]||v==hs[x]) continue;dfs2(v,v);}
}int lca(int x,int y){int ret;while(top[x]!=top[y]){dep[top[x]]>dep[top[y]]?x=fa[top[x]]:y=fa[top[y]];}return dep[x]<dep[y]?x:y;
}int ans,sum[MAXN];
void dfs(int cur){for(int i=head[cur];i;i=e[i].next){int v=e[i].to;if(v==fa[cur]) continue;dfs(v);sum[cur]+=sum[v];}ans=max(sum[cur],ans);
}int main(){n=rd();m=rd();int x,y,t;for(int i=1;i<=n-1;i++){x=rd();y=rd();add(x,y);add(y,x);}dfs1(1,0);dfs2(1,1);for(int i=1;i<=m;i++){x=rd();y=rd();t=lca(x,y);sum[x]+=1;sum[y]+=1;sum[t]-=1;sum[fa[t]]-=1;}dfs(1);cout<<ans<<endl;return 0;
}

树上差分

#include<iostream>
#include<cstring>
#include<cstdio>using namespace std;inline int rd(){int ret=0,f=1;char c;while(c=getchar(),!isdigit(c))f=c=='-'?-1:1;while(isdigit(c))ret=ret*10+c-'0',c=getchar();return ret*f;
}const int MAXN=500005<<2;struct Edge{int next,to;Edge(int x=0,int y=0){next=x;to=y;}
}e[MAXN];
int ecnt,head[MAXN];
inline void add(int x,int y){e[++ecnt]=Edge(head[x],y);head[x]=ecnt;
}int n,m;struct Seg{#define ls (cur<<1)#define rs (cur<<1|1)#define mid (l+r>>1)int mx[MAXN],add[MAXN];Seg(){memset(mx,0,sizeof(mx));memset(add,0,sizeof(add));}void pushup(int cur){mx[cur]=max(mx[ls],mx[rs]);}void pushdown(int cur,int l,int r){int v=add[cur];add[ls]+=v;add[rs]+=v;mx[ls]+=v;mx[rs]+=v;add[cur]=0;}void build(int cur,int l,int r){if(l==r) {mx[cur]=0;return;}build(ls,l,mid);build(rs,mid+1,r);pushup(cur);}void update(int L,int R,int cur,int l,int r,int w){if(L<=l&&r<=R){mx[cur]+=w;add[cur]+=w;return;}pushdown(cur,l,r);if(L<=mid) update(L,R,ls,l,mid,w);if(mid <R) update(L,R,rs,mid+1,r,w);pushup(cur);}
}T;int fa[MAXN],dep[MAXN],siz[MAXN],hs[MAXN];
void dfs1(int x,int pre){fa[x]=pre;dep[x]=dep[pre]+1;siz[x]=1;int mx=0,tmp=0;for(int i=head[x];i;i=e[i].next){int v=e[i].to;if(v==pre) continue;dfs1(v,x);siz[x]+=siz[v];if(siz[v]>mx){mx=siz[v];tmp=v;}}hs[x]=tmp;
}int top[MAXN],id[MAXN],tot;
void dfs2(int x,int tp){top[x]=tp;id[x]=++tot;if(hs[x]) dfs2(hs[x],tp);for(int i=head[x];i;i=e[i].next){int v=e[i].to;if(v==fa[x]||v==hs[x]) continue;dfs2(v,v);}
}void updateLink(int x,int y,int w){while(top[x]!=top[y]){if(dep[top[x]]<dep[top[y]]) swap(x,y);T.update(id[top[x]],id[x],1,1,n,w);x=fa[top[x]];}if(dep[x]>dep[y]) swap(x,y);T.update(id[x],id[y],1,1,n,w);
}int main(){n=rd();m=rd();int x,y;for(int i=1;i<=n-1;i++){x=rd();y=rd();add(x,y);add(y,x);}dfs1(1,0);dfs2(1,1);T.build(1,1,n); for(int i=1;i<=m;i++){x=rd();y=rd();updateLink(x,y,1);}cout<<T.mx[1];return 0;
}

树剖

转载于:https://www.cnblogs.com/ghostcai/p/9380643.html

[LUOGU] P3128 [USACO15DEC]最大流Max Flow相关推荐

  1. P3128 [USACO15DEC]最大流Max Flow

    P3128 [USACO15DEC]最大流Max Flow 对,这是一道最大流的题目qwq 树上跑最大流,没错 也就是跑最小割 你看名字里都有最大流,为什么不能跑最大流qwq............. ...

  2. 洛谷 P3128 [USACO15DEC]最大流Max Flow

    题意简述 给定一颗树,每次操作可以使两个点最短路上的点+1,求最大的点 题解思路 树上差分 若操作u, v,则++f[u], ++f[v], --f[lca(u, v)], --f[father(lc ...

  3. [luogu P3128][USACO15DEC]Max Flow [LCA][树上差分]

    题目描述 Farmer John has installed a new system of  pipes to transport milk between the  stalls in his b ...

  4. 【USACO15DEC】最大流Max Flow

    题面 FJ给他的牛棚的N(2≤N≤50,000)个隔间之间安装了N-1根管道,隔间编号从1到N.所有隔间都被管道连通了. FJ有K(1≤K≤100,000)条运输牛奶的路线,第i条路线从隔间si运输到 ...

  5. 通俗讲解Ford-Fulkerson算法求最大流Max Flow

    什么是流网络 流网络是一种特殊的单向有权连通图.有且只有一个源点和汇点,权重作为容量. 图中a点是源点,也就是起点,一般记作s,f是汇点,也就是终点,一般记作t. 通过以上流网络衍生出来的,满足每条边 ...

  6. P3128-最大流Max Flow【树上差分,LCA】

    正题 题目大意 一棵树 若干条路径,哪个点经过的路径最多,求路径条数. 解题思路 对于每条路径计算一次LCALCALCA,然后树上差分就好了. codecodecode #include<cst ...

  7. P3128 [USACO15DEC]Max Flow P

    P3128 [USACO15DEC]Max Flow P 树上差分之点差分模板题 题目描述: FJ给他的牛棚的N(2≤N≤50,000)个隔间之间安装了N-1根管道,隔间编号从1到N.所有隔间都被管道 ...

  8. HDU 4183(max flow)

    HDU 4183(max flow) 链接 题意:orz,论翻译的重要性,看了半天.进入正题: 有n(2 <= n <= 300)个圆圈,每个圆圈都有其频率f,坐标(x,y),半径r.(题 ...

  9. SAP SD基础知识之凭证流(Document Flow)

    SAP SD基础知识之凭证流(Document Flow) 一,根据参考创建Create with reference 可以参考之前的凭证来创建销售凭证,可以在初始画面,也可以在凭证处理过程中,通过u ...

最新文章

  1. 我用1台笔记本模拟黑洞引力波,和超算2个月得出的结果只差1%
  2. maven 笔记,概念
  3. hpm1216nfh驱动程序_惠普HP LaserJet Pro M1216nfh 一体机驱动
  4. Game On Serverless:SAE 助力广州小迈提升微服务研发效能
  5. .net中关键字new的用法
  6. tomcat配置请求指定html文件路径,Tomcat8限制指定域名或者IP访问(示例代码)
  7. Docker加入白名单
  8. nginx配置多个域名_Nginx配置多个网站/项目的简单方式
  9. CSS控制显示超出部分,用省略号显示
  10. 77GHz雷达信号处理流程框图及应用方案
  11. python可以查ip地址吗_python实现查询IP地址所在地
  12. 夜神模拟器 Nox Player 雷电模拟器 掉线 连不上 运行不显示的解决方案
  13. git clone 失败问题解决方案
  14. java课程设计模板_《JAVA课程设计模板.doc
  15. UE4关于材质的几个小技巧
  16. 华为借贴牌沃达丰闯欧洲 首款3G手机9月上市
  17. 404是什么意思?404错误页面是怎么造成的
  18. 一次有趣的 DNS 导致 Node 服务故障问题分析实录
  19. 两个usb摄像头通过hub连接电脑怎么同时独立显示_把电脑装进口袋是什么感觉?华硕VivoStick TS10多角度体验...
  20. 我做淘宝7年的工作经验总结

热门文章

  1. PHP date 格式化一个本地时间/日期
  2. 关于DateTime对象序列化为Json之后的若干问题
  3. [Android ] linux命令英文缩写的含义(方便记忆)
  4. 构建Hybrid应用-构建ionic开发环境
  5. android phonegap插件开发方法 plugin
  6. MySQL SHOW TABLE STATUS 获取表的信息
  7. 【原创】实现日、周、月排行统计
  8. 使用ASP.NET2.0显示照片
  9. m_Orchestrate learning system---十八、mo项目的启示是什么
  10. 进击的 JavaScript 之(七) 原型链