未完待续
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 const int N = 30100; 6 7 int read(){ 8 int x = 0;char ch = getchar(); 9 while (ch < '0' || '9' < ch) ch = getchar(); 10 while ('0' <= ch && ch <= '9') x = x * 10 + ch - '0',ch = getchar(); 11 return x; 12 } 13 int getch(){ 14 char ch = getchar(); 15 while (ch != 'A' && ch != 'S' && ch != 'C') ch = getchar(); 16 if (ch == 'A') return 0; 17 if (ch == 'S') return 1; 18 if (ch == 'C') return 2; 19 } 20 21 22 struct Node{ 23 int son[2],fa,mx,sum,val; 24 }; 25 struct Edge{ 26 int next,end; 27 }edge[N<<1]; 28 29 30 int a[N],first[N],efn; 31 struct Lct{ 32 int ncnt; 33 Node nod[N]; 34 void init(int p){ 35 ncnt = p; 36 for (int i = 1;i <= p;i++){ 37 Node&g = nod[i]; 38 g.son[0] = g.son[1] = g.fa = 0; 39 g.mx = g.sum = g.val = a[i]; 40 } 41 } 42 void update(int p){ 43 Node&g = nod[p]; 44 int u = g.son[0],v = g.son[1]; 45 g.sum = g.val+nod[u].sum+nod[v].sum; 46 g.mx = max(g.mx,max(nod[u].mx,nod[v].mx)); 47 } 48 void splay(int x){ 49 while (check(x) != -1){ 50 int y = nod[x].fa;int u = check(x); 51 if (check(y) == u) rotate(y,u^1); 52 rotate(x,u^1); 53 } 54 } 55 int check(int p){ 56 int u = nod[p].fa; 57 if (u == 0) return -1; 58 if (nod[u].son[0] == p) return 0; 59 if (nod[u].son[1] == p) return 1; 60 return -1; 61 } 62 void rotate(int x,int d){ 63 int y = nod[x].fa,z = check(y); 64 nod[x].fa = nod[y].fa; 65 if (z != -1) nod[nod[y].fa].son[z] = x; 66 nod[y].fa = x; 67 nod[y].son[d^1] = nod[x].son[d]; 68 if (nod[x].son[d]) nod[nod[x].son[d]].fa = y; 69 nod[x].son[d] = y; 70 update(y); 71 update(x); 72 } 73 74 75 }lct; 76 77 int n; 78 void addedge(int,int); 79 int main(){ 80 n = read(); 81 for (int i = 1;i < n;i++){ 82 int x = read(),y = read(); 83 addedge(x,y); 84 } 85 for (int i = 1;i <= n;i++) a[i] = read(); 86 lct.init(n); 87 dfs(1,0); 88 m = read(); 89 for (int i = 1;i <= m;i++){ 90 int opt = getch(); 91 if (opt == 0){ 92 } 93 else if (opt == 1){ 94 } 95 else{ 96 int x,y;x = read();y = read(); 97 lct.change(x,y); 98 } 99 } 100 return 0; 101 } 102 void addedge(int x,int y){ 103 edge[++efn].end = y; 104 edge[ efn].next = first[x]; 105 first[x] = efn; 106 edge[++efn].end = x; 107 edge[ efn].next = first[y]; 108 first[y] = efn; 109 }