[POJ3728]The merchant(tanrjan_lca + DP)
比着题解写还错。。。
查了两个小时没查出来,心态爆炸啊
以后再查
——代码(WA)
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #define N 2000001 5 #define Min(x, y) ((x) < (y) ? (x) : (y)) 6 #define Max(x, y) ((x) > (y) ? (x) : (y)) 7 #define swap(x, y) ((x) ^= (y) ^= (x) ^= (y)) 8 9 int n, m, cnt, qcnt, acnt; 10 int f[N], fa[N], max[N], min[N], up[N], down[N], ans[N]; 11 int head[N], to[N << 1], next[N << 1], qhead[N], qu[N << 1], qv[N << 1], qid[N << 1], qnext[N << 1], ahead[N], ato[N << 1], anext[N << 1]; 12 13 inline int read() 14 { 15 int x = 0, f = 1; 16 char ch = getchar(); 17 for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1; 18 for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0'; 19 return x * f; 20 } 21 22 inline void add(int x, int y) 23 { 24 to[cnt] = y; 25 next[cnt] = head[x]; 26 head[x] = cnt++; 27 } 28 29 inline void add_ask(int x, int y, int z) 30 { 31 qu[qcnt] = x; 32 qv[qcnt] = y; 33 qid[qcnt] = z; 34 qnext[qcnt] = qhead[x]; 35 qhead[x] = qcnt++; 36 } 37 38 inline void add_ans(int x, int y) 39 { 40 ato[acnt] = y; 41 anext[acnt] = ahead[x]; 42 ahead[x] = acnt++; 43 } 44 45 inline int find(int x) 46 { 47 if(x ^ f[x]) 48 { 49 int fx = f[x]; 50 f[x] = find(f[x]); 51 up[x] = Max(up[x], Max(up[fx], max[fx] - min[x])); 52 down[x] = Max(down[x], Max(down[fx], max[x] - min[fx])); 53 max[x] = Max(max[fx], max[x]); 54 min[x] = Min(min[fx], max[x]); 55 } 56 return f[x]; 57 } 58 59 inline void dfs(int u) 60 { 61 int i, v, x, y; 62 f[u] = u; 63 for(i = qhead[u]; i ^ -1; i = qnext[i]) 64 if(f[qv[i]]) 65 { 66 x = find(qv[i]); 67 add_ans(x, i); 68 } 69 for(i = head[u]; i ^ -1; i = next[i]) 70 { 71 v = to[i]; 72 if(v ^ fa[u]) fa[v] = u, dfs(v); 73 } 74 for(i = ahead[u]; i ^ -1; i = anext[i]) 75 { 76 x = qu[ato[i]]; 77 y = qv[ato[i]]; 78 find(x), find(y); 79 if(ato[i] & 1) swap(x, y); 80 ans[qid[ato[i]]] = Max(max[y] - min[x], Max(up[x], down[y])); 81 } 82 f[u] = fa[u]; 83 } 84 85 int main() 86 { 87 int i, j, x, y; 88 while(~scanf("%d", &n)) 89 { 90 cnt = qcnt = acnt = 0; 91 memset(head, -1, sizeof(head)); 92 memset(qhead, -1, sizeof(qhead)); 93 memset(ahead, -1, sizeof(ahead)); 94 memset(f, 0, sizeof(f)); 95 memset(fa, 0, sizeof(fa)); 96 memset(ans, 0, sizeof(ans)); 97 for(i = 1; i <= n; i++) min[i] = max[i] = read(), up[i] = down[i] = 0; 98 for(i = 1; i < n; i++) 99 { 100 x = read(); 101 y = read(); 102 add(x, y); 103 add(y, x); 104 } 105 m = read(); 106 for(i = 1; i <= m; i++) 107 { 108 x = read(); 109 y = read(); 110 add_ask(x, y, i); 111 add_ask(y, x, i); 112 } 113 dfs(1); 114 for(i = 1; i <= m; i++) printf("%d\n", ans[i]); 115 } 116 return 0; 117 }