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

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

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

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

#include<iostream>
#include<cstring>
#include<cstdio> using namespace std; inline int rd(){
int ret=,f=;char c;
while(c=getchar(),!isdigit(c))f=c=='-'?-:;
while(isdigit(c))ret=ret*+c-'',c=getchar();
return ret*f;
} const int MAXN=<<; struct Edge{
int next,to;
Edge(int x=,int
y=){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]+;siz[x]=;
int mx=,tmp=;
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=;i<=n-;i++){
x=rd();y=rd();
add(x,y);add(y,x);
}
dfs1(,);
dfs2(,);
for(int i=;i<=m;i++){
x=rd();y=rd();t=lca(x,y);
sum[x]+=;sum[y]+=;
sum[t]-=;sum[fa[t]]-=;
}
dfs();
cout<<ans<<endl;
return ;
}

树上差分

#include<iostream>
#include<cstring>
#include<cstdio> using namespace std; inline int rd(){
int ret=,f=;char c;
while(c=getchar(),!isdigit(c))f=c=='-'?-:;
while(isdigit(c))ret=ret*+c-'',c=getchar();
return ret*f;
} const int MAXN=<<; struct Edge{
int next,to;
Edge(int x=,int
y=){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,,sizeof(mx));memset(add,,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]=;
}
void build(int cur,int l,int r){
if(l==r) {mx[cur]=;return;}
build(ls,l,mid);build(rs,mid+,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+,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]+;siz[x]=;
int mx=,tmp=;
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],,,n,w);
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
T.update(id[x],id[y],,,n,w);
} int main(){
n=rd();m=rd();
int x,y;
for(int i=;i<=n-;i++){
x=rd();y=rd();
add(x,y);add(y,x);
}
dfs1(,);
dfs2(,);
T.build(,,n);
for(int i=;i<=m;i++){
x=rd();y=rd();
updateLink(x,y,);
}
cout<<T.mx[];
return ;
}

树剖

[LUOGU] P3128 [USACO15DEC]最大流Max Flow的更多相关文章

  1. 【luogu P3128 [USACO15DEC]最大流Max Flow】 题解

    题目链接:https://www.luogu.org/problemnew/show/P3128 菜 #include <cstdio> #include <cstring> ...

  2. luogu P3128 [USACO15DEC]最大流Max Flow (树上差分)

    题目描述 Farmer John has installed a new system of N-1N−1 pipes to transport milk between the NN stalls ...

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

    P3128 [USACO15DEC]最大流Max Flow 题目描述 Farmer John has installed a new system of N-1N−1 pipes to transpo ...

  4. P3128 [USACO15DEC]最大流Max Flow(LCA+树上差分)

    P3128 [USACO15DEC]最大流Max Flow 题目描述 Farmer John has installed a new system of  pipes to transport mil ...

  5. 洛谷P3128 [USACO15DEC]最大流Max Flow [树链剖分]

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

  6. 洛谷 P3128 [ USACO15DEC ] 最大流Max Flow —— 树上差分

    题目:https://www.luogu.org/problemnew/show/P3128 倍增求 lca 也写错了活该第一次惨WA. 代码如下: #include<iostream> ...

  7. 树上差分——点差分裸题 P3128 [USACO15DEC]最大流Max Flow

    讲解: https://rpdreamer.blog.luogu.org/ci-fen-and-shu-shang-ci-fen #include <bits/stdc++.h> #def ...

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

    https://www.luogu.org/problem/show?pid=3128 题目描述 Farmer John has installed a new system of  pipes to ...

  9. 洛谷P3128 [USACO15DEC]最大流Max Flow [倍增LCA]

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

随机推荐

  1. swap(2018.10.16)

    题意:给定一个{0,1,2,3,-,n-1}的排列 p. 一个{0,1,2 ,-,n-2}的排列 q 被认为是优美的排列, 当且仅当 q 满足下列条件 对排列 s={0,1,2,3,...,n-1}进 ...

  2. 最长上升序列(Lis)

    Description A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequence ...

  3. Linux | C代码的编写、运行和调试

    1.  建立.c文件 在终端下输入:vi mytest.c [使用编辑器 vim] 键入键盘i键,使vi编辑器进入编辑模式 接下来在vi编译器中编写代码,如: #include <stdio.h ...

  4. [題解]luogu_P1854 花店櫥窗佈置

    來源:題解 一開始看不懂題目,一萬年了終於看懂 f [ i ] [ j ] 表示第i朵花放在第j個花瓶中最大美學值,(花是必須用完嗎?) 顯然放i-1朵花至少要放到前i-1個瓶子里,最多放到前j-1個 ...

  5. 101 Symmetric Tree 判断一颗二叉树是否是镜像二叉树

    给定一个二叉树,检查它是否是它自己的镜像(即,围绕它的中心对称).例如,这个二叉树 [1,2,2,3,4,4,3] 是对称的.    1   / \  2   2 / \ / \3  4 4  3但是 ...

  6. (转)Unity中使用C#实现Zip包的压缩与解压

    使用SharpZipLib库,下载地址为:http://icsharpcode.github.io/SharpZipLib/ /************************************ ...

  7. 一个页面有相同ID元素的情况分析

    经常会遇到一个页面中有相同定义相同id的情况,从道理上来说,id应该是这个页面中某个元素的唯一标识,所以不应该出现有相同id的情况,否则会产生意想不到的结果.而且各个浏览器的表现也是不一样的.我只做了 ...

  8. 如何查看和分析IIS日志

    日志的在IIS中是很重要的,但是很多人却忽略了,在这里说说,日志格式建议使用W3C扩充日志文件格式,这也是IIS 5.0默认的格式,可以指定每天记录客户IP地址.用户名.服务器端口.方法.URI资源. ...

  9. js 学习网站

    1.  Mozilla Developer Network(MDN) 这里你可以找到官方的完整的javascript参考,还有许多有用的指导,教程以及文章,从基本javascript使用到最佳实践以及 ...

  10. 在Window上用cmd创建.htaccess文件

    Windows 图形下不能直接建立空名字的文件,所以没法直接创建.htaccess文件,不过可以通过命令行创建: cd /path/to/your/dir/ type nul>.htaccess ...