Sequence operation3397

http://acm.hdu.edu.cn/showproblem.php?pid=3397

空间要开大点不然就RE。更新比较复杂,在取反时要注意先向下更新。

如这样的数据:

1

10 10
0 0 0 1 1 0 1 0 1 1

2 0 9

2 0 9

4 0 2

1 0 9

2 0 8

4 0 2

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #define lson l,mid,i<<1
  5 #define rson mid+1,r,i<<1|1
  6 using namespace std;
  7 const int Ni = 100100;
  8 int n;
  9 struct node {
 10     int sum1,sum0;
 11     int mx1,lm1,rm1;
 12     int mx0,lm0,rm0;
 13     int lnum,rnum;
 14 }tree[Ni<<3];
 15 int color[Ni<<3];
 16 inline void changes(int i)
 17 {
 18     swap(tree[i].mx1,tree[i].mx0);
 19     swap(tree[i].sum1,tree[i].sum0);
 20     swap(tree[i].lm1,tree[i].lm0);
 21     swap(tree[i].rm1,tree[i].rm0);
 22     tree[i].lnum=!tree[i].lnum;
 23     tree[i].rnum=!tree[i].rnum;
 24 }
 25 inline void pushup(int l,int r,int i)
 26 {
 27     tree[i].mx1=max(tree[i<<1].mx1,tree[i<<1|1].mx1);///111111
 28     if(tree[i<<1].rnum==1&&tree[i<<1|1].lnum==1)
 29     {
 30         tree[i].mx1=max(tree[i].mx1,tree[i<<1].rm1+tree[i<<1|1].lm1);
 31     }
 32     int mid=(l+r)>>1;
 33     if(tree[i<<1].mx1==mid-l+1&&tree[i<<1].rnum==1&&tree[i<<1|1].lnum==1)
 34         tree[i].lm1=tree[i<<1].mx1+tree[i<<1|1].lm1;
 35     else
 36         tree[i].lm1=tree[i<<1].lm1;
 37 
 38     if(tree[i<<1|1].mx1==r-mid&&tree[i<<1].rnum==1&&tree[i<<1|1].lnum==1)
 39         tree[i].rm1=tree[i<<1|1].mx1+tree[i<<1].rm1;
 40     else
 41         tree[i].rm1=tree[i<<1|1].rm1;
 42     tree[i].lnum=tree[i<<1].lnum;
 43     tree[i].rnum=tree[i<<1|1].rnum;
 44     tree[i].sum1=tree[i<<1].sum1+tree[i<<1|1].sum1;
 45 
 46     tree[i].mx0=max(tree[i<<1].mx0,tree[i<<1|1].mx0);///000000
 47     if(tree[i<<1].rnum==0&&tree[i<<1|1].lnum==0)
 48     {
 49         tree[i].mx0=max(tree[i].mx0,tree[i<<1].rm0+tree[i<<1|1].lm0);
 50     }
 51     mid=(l+r)>>1;
 52     if(tree[i<<1].mx0==mid-l+1&&tree[i<<1].rnum==0&&tree[i<<1|1].lnum==0)
 53         tree[i].lm0=tree[i<<1].mx0+tree[i<<1|1].lm0;
 54     else
 55         tree[i].lm0=tree[i<<1].lm0;
 56 
 57     if(tree[i<<1|1].mx0==r-mid&&tree[i<<1].rnum==0&&tree[i<<1|1].lnum==0)
 58         tree[i].rm0=tree[i<<1|1].mx0+tree[i<<1].rm0;
 59     else
 60         tree[i].rm0=tree[i<<1|1].rm0;
 61     tree[i].lnum=tree[i<<1].lnum;
 62     tree[i].rnum=tree[i<<1|1].rnum;
 63     tree[i].sum0=tree[i<<1].sum0+tree[i<<1|1].sum0;
 64 }
 65 inline void pushdown(int l,int r,int i)
 66 {
 67     if(color[i]==-8) return;
 68     if(color[i]==1)
 69     {
 70         color[i<<1]=color[i<<1|1]=1;
 71         color[i]=-8;
 72         int mid=(l+r)>>1;
 73         tree[i<<1].mx1=tree[i<<1].sum1=mid-l+1;
 74         tree[i<<1].lm1=tree[i<<1].rm1=mid-l+1;
 75         tree[i<<1].mx0=tree[i<<1].sum0=0;
 76         tree[i<<1].lm0=tree[i<<1].rm0=0;
 77         tree[i<<1].lnum=tree[i<<1].rnum=1;
 78 
 79         tree[i<<1|1].mx1=tree[i<<1|1].sum1=r-mid;
 80         tree[i<<1|1].lm1=tree[i<<1|1].rm1=r-mid;
 81         tree[i<<1|1].mx0=tree[i<<1|1].sum0=0;
 82         tree[i<<1|1].lm0=tree[i<<1|1].rm0=0;
 83         tree[i<<1|1].lnum=tree[i<<1|1].rnum=1;
 84     }else if(color[i]==0)
 85     {
 86         color[i<<1]=color[i<<1|1]=0;
 87         color[i]=-8;
 88         int mid=(l+r)>>1;
 89         tree[i<<1].mx1=tree[i<<1].sum1=0;
 90         tree[i<<1].lm1=tree[i<<1].rm1=0;
 91         tree[i<<1].mx0=tree[i<<1].sum0=mid-l+1;
 92         tree[i<<1].lm0=tree[i<<1].rm0=mid-l+1;
 93         tree[i<<1].lnum=tree[i<<1].rnum=0;
 94 
 95         tree[i<<1|1].mx1=tree[i<<1|1].sum1=0;
 96         tree[i<<1|1].lm1=tree[i<<1|1].rm1=0;
 97         tree[i<<1|1].mx0=tree[i<<1|1].sum0=r-mid;
 98         tree[i<<1|1].lm0=tree[i<<1|1].rm0=r-mid;
 99         tree[i<<1|1].lnum=tree[i<<1|1].rnum=0;
100     }else if(color[i]==2)
101     {
102         if(l<r){
103             int mid=(l+r)>>1;
104             pushdown(l,mid,i<<1);
105             pushdown(mid+1,r,i<<1|1);
106         }
107         color[i<<1]=color[i<<1|1]=2;
108         color[i]=-8;
109         changes(i<<1);
110         changes(i<<1|1);
111     }
112 }
113 void build(int l=1,int r=n,int i=1)
114 {
115     color[i]=-8;
116     if(l==r)
117     {
118         int num;
119         scanf("%d",&num);
120         tree[i].lnum=tree[i].rnum=num;
121 
122         tree[i].sum1=tree[i].mx1=num;
123         tree[i].lm1=tree[i].rm1=num;
124 
125         tree[i].sum0=tree[i].mx0=!num;
126         tree[i].lm0=tree[i].rm0=!num;
127         return;
128     }
129     int mid=(l+r)>>1;
130     build(lson);
131     build(rson);
132     pushup(l,r,i);
133 }
134 int query(int ql,int qr,int flg,int l=1,int r=n,int i=1)
135 {
136     int ans=0;
137     if(flg==4)
138     {
139         int lsum=0,rsum=0;
140         if(ql<=l&&r<=qr) return tree[i].mx1;
141         int mid=(l+r)>>1;
142         pushdown(l,r,i);
143         if(tree[i<<1].rnum==1&&tree[i<<1|1].lnum==1)
144         {
145             int lsum,rsum;
146             lsum=min(mid-ql+1,tree[i<<1].rm1);
147             rsum=min(qr-mid,tree[i<<1|1].lm1);
148             ans=lsum+rsum;
149         }
150         if(ql<=mid) lsum=query(ql,qr,flg,lson);
151         if(qr>mid) rsum=query(ql,qr,flg,rson);
152         ans=max(ans,lsum);
153         ans=max(ans,rsum);
154     }
155     else
156     {
157         if(ql<=l&&r<=qr) return tree[i].sum1;
158         int mid=(l+r)>>1;
159         pushdown(l,r,i);
160         if(ql<=mid) ans+=query(ql,qr,flg,lson);
161         if(qr>mid) ans+=query(ql,qr,flg,rson);
162     }
163     return ans;
164 }
165 void update(int ql,int qr,int num,int l=1,int r=n,int i=1)
166 {
167     if(ql<=l&&r<=qr)
168     {
169         if(num==1)
170         {
171             tree[i].mx1=tree[i].sum1=(r-l+1);
172             tree[i].lm1=tree[i].rm1=(r-l+1);
173 
174             tree[i].mx0=tree[i].sum0=0;
175             tree[i].lm0=tree[i].rm0=0;
176 
177             tree[i].lnum=tree[i].rnum=num;
178             color[i]=num;
179         }
180         else if(num==0)
181         {
182             tree[i].mx1=tree[i].sum1=0;
183             tree[i].lm1=tree[i].rm1=0;
184 
185             tree[i].mx0=tree[i].sum0=(r-l+1);
186             tree[i].lm0=tree[i].rm0=(r-l+1);
187 
188             tree[i].lnum=tree[i].rnum=num;
189             color[i]=num;
190         }
191         else if(num==2)
192         {
193             if(color[i]==2)
194             {
195                 color[i]=-8;
196             }
197             else
198             {
199                 if(l<r)
200                 pushdown(l,r,i);
201                 color[i]=2;
202             }
203             changes(i);
204         }
205         return;
206     }
207     pushdown(l,r,i);
208     int mid=(l+r)>>1;
209     if(ql<=mid) update(ql,qr,num,lson);
210     if(qr>mid) update(ql,qr,num,rson);
211     pushup(l,r,i);
212 }
213 int main()
214 {
215     int m,i,t,l,r,f;
216     cin>>t;
217     while(t--)
218     {
219         scanf("%d%d",&n,&m);
220         build();
221         for(i=0;i<m;i++)
222         {
223             scanf("%d%d%d",&f,&l,&r);
224             l++;r++;
225             if(f<3)
226             {
227                 update(l,r,f);
228             }
229             else
230             {
231                 int ans=query(l,r,f);
232                 printf("%d\n",ans);
233             }
234         }
235     }
236     return 0;
237 }
原文地址:https://www.cnblogs.com/qijinbiao/p/2624920.html