A tree difference template title

// 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 }

 

Guess you like

Origin www.cnblogs.com/pupil-xj/p/11608234.html