題目
https://www.luogu.com.cn/problem/P3128
解題思路
樹上差分。
代碼
#pragma GCC optimize("O2")
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#include<cstdio>
#include<algorithm>
#include<string>
#define maxn 50010
#define rep(i,x,y) for(register int i=x;i<=y;i++)
using namespace std;
struct node{int y,next;}a[maxn<<2];
int head[maxn<<2],d[maxn],n,m,c[maxn],f[maxn][25],ans,tot;
inline void add(int x,int y){a[++tot]=(node){y,head[x]}; head[x]=tot;}
inline int read(){
int p=0; char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) p=(p<<3)+(p<<1)+c-48,c=getchar();
return p;
}
inline void dfs(int x,int fa){
d[x]=d[fa]+1,f[x][0]=fa;
for(register int i=0;i<=20;i++) f[x][i+1]=f[f[x][i]][i];
for(int i=head[x];i;i=a[i].next) if (a[i].y!=fa) dfs(a[i].y,x);
}
inline int lca(int x,int y){
if (d[x]>d[y]) swap(x,y);
for(int i=20;i>=0;i--) if (d[x]<=d[y]-(1<<i)) y=f[y][i];
if (x==y) return x;
for(int i=20;i>=0;i--) if (f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
return f[x][0];
}
inline void Getans(int x,int fa){
for(register int i=head[x];i;i=a[i].next)
if (a[i].y!=fa) Getans(a[i].y,x),c[x]+=c[a[i].y];
ans=max(ans,c[x]);
}
signed main(){
n=read(),m=read();
int x,y,l;
rep(i,1,n-1){
x=read(),y=read();
add(x,y),add(y,x);
}
dfs(1,0);
rep(i,1,m){
x=read(),y=read();
l=lca(x,y),c[x]++,c[y]++,c[l]--,c[f[l][0]]--;
}
Getans(1,0);
return 0&printf("%d",ans);
}