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/archive/2012/08/06/2624920.html

Sequence operation3397相关推荐

  1. Bi-LSTM-CRF for Sequence Labeling

    做了一段时间的Sequence Labeling的工作,发现在NER任务上面,很多论文都采用LSTM-CRFs的结构.CRF在最后一层应用进来可以考虑到概率最大的最优label路径,可以提高指标. 一 ...

  2. Oracle 12C -- 基于sequence的列的默认值

    12C支持先创建一个sequence,然后再将该sequence指定为某个列的值的默认表达式. 和"identity column"具有以下不同点: ·对列的个数没有限制 ·seq ...

  3. DP UVALive 6506 Padovan Sequence

    题目传送门 /*题意:两行数字,相邻列一上一下,或者隔一列两行都可以,从左到右选择数字使和最大DP:状态转移方程:dp[i][j] = max (dp[i][j], dp[1-i][j-1] + a[ ...

  4. HDOJ-2062 :Subset sequence(DP)

    题目:求子集序列 Consider the aggregate An= { 1, 2, -, n }. For example, A1={1}, A3={1,2,3}. A subset sequen ...

  5. Gold Code,Gold Sequence

    Gold Code Gold Code是以Robert Gold的名字命名的.它是一组特殊的二进制随机(伪随机)序列,其中成员序列之间的相关性很小.由于这种特性(较小的相关性),它被广泛地用作各种无线 ...

  6. HDU 1711 Number Sequence(KMP算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 Number Sequence Time Limit: 10000/5000 MS (Java/ ...

  7. 【C++】C++11 STL算法(一):非修改序列操作(Non-modifying sequence operations)

    目录 一.all_of.any_of.none_of: 1.官方说明 2.谓词 3.STL算法对谓词的说明 4.谓词的五种模式 5.all_of (C++ 11) 6.any_of (C++ 11) ...

  8. Sequence point 中文

    摘自维基百科: In C[4] and C++,[5] sequence points occur in the following places. (In C++, overloaded opera ...

  9. swift Sequence 和 SubSequence

    1 序列 Sequence 序列协议是集合类型结构中的基础. 一个序列是代表有一系列具有相同类型的值,并且对这些值进行迭代. 协议中主要有两个参数,一个是元素Element,一个就是迭代器Iterat ...

  10. 创新类编辑推荐:Sequence iBPMS平台

    创新类编辑推荐是Sequence,一个"iBPMS"工作流管理平台.本文介绍了该产品以及用户是如何成功使用该平台的. SearchSOA的编辑会定期为创新性和市场影响而表彰应用集成 ...

最新文章

  1. phpcms V9利用num++实现多样形式列表标签调用
  2. Netbeans and Remote Host for C/C++ Developing
  3. 2020ICPC(小米邀请赛2) - Data Structure Problem(线段树+树状数组)
  4. C#退出窗体的总结方法
  5. 如何对聚类结果进行分析_产品经理如何进行数据分析?
  6. (原创)如何进行有符号小数乘法运算?(Verilog)
  7. FREETEXTBOX
  8. 记录php项目遇到502和504 Bad Gateway问题
  9. 全链路日志追踪系统介绍与思考
  10. ElasticJob分布式调度,分布式多个微服务执行只需要执行一个定时任务,基本概念介绍(一)
  11. Outlook2016邮箱配置说明文档
  12. 没有寻线仪怎么找网线_乱七八糟的网线怎么找?寻线仪来帮你
  13. 怎么把微信公众号的文章里的音频或视频下载到电脑和手机
  14. 美通企业日报 | 四所中国大陆高校进入亚洲大学前十;工作时间过长威胁IT从业人员健康...
  15. Ubuntu中复制文件出现权限不够的问题
  16. WRT之Crosswalk简介
  17. 1024程序员节,向改变世界的程序员致敬
  18. gbase 8d客户端连接注意事项
  19. java找茬_一起来找茬(1)-开发写的神奇左连接
  20. 食品行业渠道商商城系统渠道利益透明,加速企业资金回笼

热门文章

  1. Java三种连接池(druid、c3p0、dbcp)
  2. 通过截取实时系统日志查找问题bug的小技巧命令--linux
  3. Windows下Cesium Terrain Builder编译 (VS2015)
  4. Java基础之十年面试杂记
  5. libevent 编程疑难解答
  6. 39. (附加)二叉树是不是平衡二叉树(C++版本)
  7. python os.open禁止写入缓存区_Python-设置文件缓冲类型
  8. android studio继承关系,Android Studio中查看类的继承关系
  9. Java进阶:Dubbo
  10. 实战:小程序购物商城