#include<bits/stdc++.h>
using namespace std;
const int MX = 100010;
int n,k,ans,m;
struct GRAPH
{
int fst[MX],nxt[MX],v[MX],lnum;
void add(int nu,int nv)
{
nxt[++lnum] = fst[nu];
fst[nu] = lnum;
v[lnum] = nv;
}
}G;
inline void swap(int &a,int &b)
{
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
inline int max(int a,int b){
return a > b ? a : b;
}
struct CHAIN
{
int root;//所在根节点
int siz[MX];//子树大小
int dep[MX];//当前深度
int fa[MX];//树上的父亲
int top[MX];//所在重链的顶部
int son[MX];//重儿子
int yl[MX];
inline void dfs1(int x,int f,int d){
dep[x] = d;
siz[x] = 1;
fa[x] = f;
for(register int i = G.fst[x]; i;i = G.nxt[i])
{
int y = G.v[i];
if(y == f) continue;
dfs1(y,x,d+1);
siz[x] += siz[y];
if(siz[son[x]] < siz[y])
{
son[x] = y;
}
}
}
inline void dfs2(int x,int f,int t)
{
//cout << x << " " << f << " " << t << endl;
top[x] = t;
if(son[x]) dfs2(son[x],x,t);
for(register int i = G.fst[x]; i; i=G.nxt[i])
{
int y = G.v[i];
if(y == f || y == son[x]) continue;
dfs2(y,x,y);
}
//cout <<"asd";
}
inline int lca(int x,int y)
{
register int fx = top[x],fy = top[y];
while(fx != fy)
{
if(dep[fx] < dep[fy]) swap(fx,fy),swap(x,y);
x = fa[x],fx = top[x];
}
if(dep[x] > dep[y]) return y;
else return x;
}
inline void dfs3(int s,int fath)
{
for(register int i = G.fst[s]; i;i = G.nxt[i])
{
//cout << G.nxt[i] << endl;
int y = G.v[i];
//break;
if(y == fath)
{
continue;
}
dfs3(y,s);
yl[s] += yl[y];
//break;
}
ans = max(ans,yl[s]);
}
} C;
char buf[1<<21], *p1 = buf, *p2 = buf;//好大的数组
inline char gc() {//代替getchar
if(p1 != p2){
return *p1++;
}
p1 = buf;
p2 = p1 + fread(buf, 1, 1 << 21, stdin);
return p1 == p2 ? EOF : *p1++;
}
template<class I>//什么整数类型的都行
inline void read(I &x) {//只可惜要用文件输入才有效
x = 0; I f = 1; char c = gc();
while(c < '0' || c > '9'){
if(c == '-'){
f = -1;
c = gc();//c 是输入的
}
}
while(c >= '0' && c <= '9'){
//x = x * 10 + c - '0';
x = (x << 3) + (x << 1) + c - '0';//就相当于x * 10 +……
c = gc();//再次输入
}
x *= f;
}
inline void write(int x) {
static int sta[35];
register int top = 0;
do {
sta[top++] = x % 10,x /= 10;
} while (x);
while (top) putchar(sta[--top] + 48);
}
inline void input()
{
read(n),read(k);
register int x,y;
for(register int i = 1;i < n;++i)
{
read(x),read(y);
G.add(x,y);
G.add(y,x);
}
}
inline void work()
{
C.dfs1(1,0,1);
C.dfs2(1,0,1);
//cout <<"Asd";
for(register int i=1;i<=k;++i)
{
register int x,y;
read(x),read(y);
++C.yl[x];
++C.yl[y];
register int xx = C.lca(x,y);
--C.yl[xx];
--C.yl[C.fa[xx]];
}
C.dfs3(1,0);
write(ans);
}
int main()
{
input();
work();
return 0;
}
为什么过不了,就一个点T,超了0.03S