http://codeforces.com/contest/877/problem/E
真的菜的不行,自己敲一个模板,到处都是问题。哎
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 2e5+5; 4 #define lson (q<<1) 5 #define rson ((q<<1)|1) 6 struct node 7 { 8 int l,r,mid; 9 int v,lazy; 10 }tree[maxn*4]; 11 int L[maxn],R[maxn],index; 12 int vis[maxn] = {0}; 13 int a[maxn]; 14 vector<int> g[maxn]; 15 void dfs(int x) 16 { 17 L[x] = index; 18 for(int i=0;i<g[x].size();i++) 19 { 20 int v = g[x][i]; 21 if(!vis[v]) 22 { 23 vis[v] = 1; 24 index++; 25 dfs(v); 26 } 27 } 28 R[x] = index; 29 } 30 void push_up(int q) 31 { 32 tree[q].v = tree[lson].v+tree[rson].v; 33 } 34 void build(int l,int r,int q) 35 { 36 tree[q].l = l,tree[q].r = r,tree[q].mid = (l+r)/2; 37 tree[q].lazy = 0; 38 if(l==r) 39 { 40 tree[q].v = a[l]; 41 //printf("%d %d ",l,tree[q].v); 42 return; 43 } 44 build(l,tree[q].mid,lson); 45 build(tree[q].mid+1,r,rson); 46 push_up(q); 47 } 48 void push_down(int q) 49 { 50 if(tree[q].lazy) 51 { 52 tree[lson].v = (tree[lson].r-tree[lson].l+1)-tree[lson].v; 53 tree[rson].v = (tree[rson].r-tree[rson].l+1)-tree[rson].v; 54 tree[q].lazy ^= 1; 55 tree[lson].lazy ^= 1; 56 tree[rson].lazy ^= 1; 57 } 58 } 59 void update(int l,int r,int q) 60 { 61 if(tree[q].l>=l&&tree[q].r<=r) 62 { 63 tree[q].lazy ^= 1; 64 tree[q].v = (tree[q].r-tree[q].l+1)-tree[q].v; 65 return; 66 } 67 push_down(q); 68 if(l<=tree[q].mid) update(l,r,lson); 69 if(r>=tree[q].mid+1) update(l,r,rson); 70 push_up(q); ///v值由下往上更新 71 } 72 int query(int l,int r,int q) ///由上及下 73 { 74 if(tree[q].l>=l&&tree[q].r<=r) 75 { 76 // printf("%d %d %d %d ",tree[q].l,tree[q].r,tree[q].v,tree[q].lazy); 77 return tree[q].v; 78 } 79 push_down(q); 80 int sum = 0; 81 if(l<=tree[q].mid) sum += query(l,r,lson); 82 if(r>=tree[q].mid+1) sum += query(l,r,rson); 83 return sum; 84 } 85 int main() 86 { 87 int n;scanf("%d",&n); 88 for(int i=2;i<=n;i++) 89 { 90 int x;scanf("%d",&x); 91 g[x].push_back(i); 92 g[i].push_back(x); 93 } 94 index = 1;vis[1] = 1; 95 dfs(1); 96 for(int i=1;i<=n;i++) 97 { 98 int cc; 99 scanf("%d",&cc); 100 a[L[i]] = cc; ///按dfs序来赋值 101 } 102 build(1,n,1); 103 int q;scanf("%d",&q); 104 while(q--) 105 { 106 char s[5]; 107 int v; 108 scanf("%s %d",s,&v); 109 if(s[0]=='g') 110 { 111 printf("%d ",query(L[v],R[v],1)); 112 } 113 else 114 { 115 update(L[v],R[v],1); 116 } 117 } 118 return 0; 119 } 120 /* 121 10 122 1 2 3 3 5 5 7 7 8 123 0 0 0 0 1 1 1 1 0 0 124 10 125 pow 3 126 get 3 127 */