// Example: Luo Gu P3128 https://www.luogu.org/problem/P3128
What is the difference && // Why use differential see blog: https://www.zybuluo.com/Junlier/note/1232395
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int MAXN = 5e4+5; 6 7 inline int read() { 8 char c = getchar(); int s = 0; 9 while(c < '0' || c > '9') c = getchar(); 10 while(c >= '0' && c <= '9') s = s*10 + c - '0', c = getchar(); 11 return s; 12 } 13 14 struct node { 15 int v, next; 16 } edge[2*MAXN]; 17 int num = 1; 18 19 int n, m; 20 int head[2*MAXN]; 21 int deep[MAXN]; 22 int f[MAXN][21]; 23 int power[MAXN]; // 差分数组 24 25 inline void add_edge(int x, int y) { 26 edge[num].v = y; 27 edge[num].next = head[x]; 28 head[x] = num++; 29 } 30 31 void dfs(int cur) { 32 for(int i = head[cur]; i != -1; i = edge[i].next) { 33 if(deep[edge[i].v] == 0) { 34 deep[edge[i].v] = deep[cur] + 1; 35 f[edge[i].v][0] = cur; 36 dfs(edge[i].v); 37 } 38 } 39 } 40 41 void PRE() { 42 for(int j = 1; j <= 19; ++j) { 43 for(int i = 1; i <= n; ++i) { 44 f[i][j] = f[f[i][j-1]][j-1]; 45 } 46 } 47 } 48 49 inline int LCA(int x, int y) { 50 if(deep[x] < deep[y]) swap(x, y); 51 for(int i = 19; i >= 0; --i) { 52 if(deep[f[x][i]] >= deep[y]) { 53 x = f[x][i]; 54 } 55 } 56 if(x == y) return x; 57 for(int i = 19; i >= 0; --i) { 58 if(f[x][i] != f[y][i]) { 59 x = f[x][i]; 60 y = f[y][i]; 61 } 62 } 63 return f[x][0]; 64 } 65 66 int ans = 0; 67 void sum(int cur) { 68 for(int i = head[cur]; i != -1; i = edge[i].next) { 69 if(edge[i].v != f[cur][0]) { 70 sum(edge[i].v); 71 power[cur] += power[edge[i].v]; 72 } 73 } 74 ans = max(ans, power[cur]); 75 } 76 77 int main() { 78 memset(head, -1, sizeof(head)); 79 memset(deep, 0, sizeof(deep)); 80 memset(f, 0, sizeof(f)); 81 memset(power, 0, sizeof(power)); 82 n = read(), m = read(); 83 int s, e; 84 for(int i = 0; i != n-1; ++i) { 85 s = read(), e = read(); 86 add_edge(s, e); 87 add_edge(e, s); 88 } 89 deep[1] = 1; 90 dfs(1); 91 PRE(); 92 for(int i = 0; i != m; ++i) { 93 s = read(), e = read(); 94 int lca = LCA(s, e); 95 power[s]++, power[lca]--; 96 power[e]++, power[f[lca][0]]--; 97 } 98 add_edge(0, 1); 99 sum(0); 100 printf("%d\n", ans); 101 return 0; 102 }