O2 ----> TLE
不开O2---->AC
#include<bits/stdc++.h>
using namespace std;
vector<long long> s[500005];
long long ans=-1;
long long c[500005][19];
long long dp[500005];
long long yl[500005];
int js(int x,int f,int dep)
{
int v;
dp[x]=dep;
c[x][0]=f;
for(int i=1;i<=18;i++)
{
c[x][i]=c[c[x][i-1]][i-1];
}
for(int i=0;i<s[x].size();i++)
{
v=s[x][i];
if(v==f)
{
continue;
}
js(v,x,dep+1);
}
return 0;
}
int lca(int x,int y)
{
if(dp[x]<dp[y])
{
swap(x,y);
}
for(int i=18;i>=0;i--)
{
if(dp[c[x][i]]>=dp[y])
{
x=c[x][i];
}
}
if(x==y)
{
return x;
}
for(int i=18;i>=0;i--)
{
if(c[x][i]!=c[y][i])
{
x=c[x][i];
y=c[y][i];
}
}
return c[x][0];
}
int qz(int x)
{
int v;
for(int i=0;i<s[x].size();i++)
{
v=s[x][i];
if(v==c[x][0])
continue;
qz(v);
yl[x]+=yl[v];
}
ans=max(ans,yl[x]);
}
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=x*10+ch-48;
ch=getchar();
}
return x*f;
}
int main()
{
int n,k;
n=read();
k=read();
int a,b,c1;
for(int i=1;i<n;i++)
{
a=read();
b=read();
s[a].push_back(b);
s[b].push_back(a);
}
js(1,0,1);
for(int i=1;i<=k;i++)
{
a=read();
b=read();
yl[a]++;
yl[b]++;
c1=lca(a,b);
yl[c1]--;
yl[c[c1][0]]--;
}
qz(1);
printf("%d",ans);
return 0;
}
合着我苦苦调了十几分钟