代码如下
// lg数组存的是log2(x)的值
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
#include<queue>
#include<cmath>
#include<cstring>
#include<bitset>
#define grandfa father[s][i-1]
#define X 20005
#define ll long long
#define mod 10007
#define maxn 100050
using namespace std;
inline int Max(int a,int b) {return a>b?a:b;}
inline int Min(int a,int b) {return a<b?a:b;}
inline void Swap(int &a,int &b) {a=a^b;b=a^b;a=a^b;}
inline int scan()
{
register int x=0;
register char c=getchar();
while (c<'0'||c>'9')
{
c=getchar();
}
while(c>='0'&&c<='9')
{
x=(x<<1)+(x<<3)+(c^48);
c=getchar();
}
return x;
}
inline void print(int x)
{
if(x/10) print(x/10);
putchar(x%10+48);
}
int edge_w[100000],edge_Next[100000],edge_to[100000];
int head[100000],total;
inline void add_edge(int u,int v,int w)
{
total++;
edge_to[total]=v;
edge_Next[total]=head[u];
head[u]=total;
}
int deep[100000],father[100000][25],lg[100000];
inline bool dfs(int s,int fa)
{
deep[s]=deep[fa]+1;
father[s][0]=fa;
for (int i=1;(1<<i)<=deep[s];i++)
father[s][i]=father[grandfa][i-1];
int e=head[s],Next;
while (e)
{
Next=edge_to[e];
Next!=fa?dfs(Next,s):true;
e=edge_Next[e];
}
}
inline int LCA (int x,int y)
{
if (deep[x]<deep[y]) Swap(x,y);
while (deep[x]>deep[y])
x=father[x][lg[deep[x]-deep[y]]];
if (x==y) return x;
for (int i=lg[deep[x]];i>=0;i--)
father[x][i]!=father[y][i]?(x=father[x][i],y=father[y][i]):0;
return father[x][0];
}
int change[100000],ans;
inline void qMaxpress(int s,int fa)
{
int e=head[s],Next;
while (e)
{
Next=edge_to[e];
Next!=fa?(qMaxpress(Next,s),change[s]+=change[Next]):0;
e=edge_Next[e];
}
ans=Max(ans,change[s]);
}
int n,k,x,y,lca;
int main()
{
n=scan();k=scan();
for(int i=2;i<=n;i++)
lg[i]=lg[i>>1]+1;
for (int i=1;i<=n-1;i++)
{
x=scan();y=scan();
add_edge(x,y,0);
add_edge(y,x,0);
}
dfs(1,0);
while (k--)
{
x=scan();y=scan();
lca=LCA(x,y);
change[x]++;change[y]++;change[lca]--;change[father[lca][0]]--;
}
qMaxpress(1,0);
print(ans);
return 0;
}