树上差分
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
int n,m,s;
int a[maxn];
int h[maxn<<1],nxt[maxn<<1],to[maxn<<1],tot;
int Log[maxn];
int dep[maxn];
int fa[maxn][35];
int num[maxn];
int ans;
void add(int x,int y)
{
tot++;
to[tot]=y;
nxt[tot]=h[x];
h[x]=tot;
}
void llog(){for (int i=2;i<=n;i++) Log[i]=Log[i>>1]+1;}
void dfs(int now,int f)
{
dep[now]=dep[f]+1;
fa[now][0]=f;
for (int i=1;i<=30;i++)
{
fa[now][i]=fa[fa[now][i-1]][i-1];
}
for (int i=h[now];i;i=nxt[i])
{
int y=to[i];
if (y == f) continue;
dfs(y,now);
}
}
int lca(int x,int y)
{
if (dep[x]>dep[y]) swap(x,y);
int d=dep[y]-dep[x];
for (int i=Log[d];i>=0;i--)
{
if (d>>i&1) y=fa[y][i];
}
if (x == y) return x;
for (int i=Log[dep[x]];i>=0;i--)
{
if (fa[x][i]!=fa[y][i])
{
x=fa[x][i];
y=fa[y][i];
}
}
return fa[x][0];
}
void dfs_num(int now,int f)
{
for (int i=h[now];i;i=nxt[i])
{
int y=to[i];
if (y == f) continue;
dfs_num(y,now);
num[now]+=num[y];
}
ans=max(ans,num[now]);
}
int main()
{
cin >> n >> m;
llog();
for (int i=1;i<=n-1;i++)
{
int x,y;
cin >> x >> y;
add(x,y);
add(y,x);
}
dfs(1,0);
while(m--)
{
int x,y;
cin >> x >> y;
int Lca=lca(x,y);
num[x]++;
num[y]++;
num[Lca]--;
if (Lca!=1) num[fa[Lca][0]]--;
}
dfs_num(1,0);
cout << ans << endl;
return 0;
}
$\mathscr{msjing}$

浙公网安备 33010602011771号