您的位置:首页 > 其它

Codeforces Round #442 (Div. 2) Danil and a Part-time Job

2017-10-25 15:11 591 查看
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\n",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\n",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\n",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 */
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐