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/archive/2012/08/06/2624920.html
Sequence operation3397相关推荐
- Bi-LSTM-CRF for Sequence Labeling
做了一段时间的Sequence Labeling的工作,发现在NER任务上面,很多论文都采用LSTM-CRFs的结构.CRF在最后一层应用进来可以考虑到概率最大的最优label路径,可以提高指标. 一 ...
- Oracle 12C -- 基于sequence的列的默认值
12C支持先创建一个sequence,然后再将该sequence指定为某个列的值的默认表达式. 和"identity column"具有以下不同点: ·对列的个数没有限制 ·seq ...
- DP UVALive 6506 Padovan Sequence
题目传送门 /*题意:两行数字,相邻列一上一下,或者隔一列两行都可以,从左到右选择数字使和最大DP:状态转移方程:dp[i][j] = max (dp[i][j], dp[1-i][j-1] + a[ ...
- HDOJ-2062 :Subset sequence(DP)
题目:求子集序列 Consider the aggregate An= { 1, 2, -, n }. For example, A1={1}, A3={1,2,3}. A subset sequen ...
- Gold Code,Gold Sequence
Gold Code Gold Code是以Robert Gold的名字命名的.它是一组特殊的二进制随机(伪随机)序列,其中成员序列之间的相关性很小.由于这种特性(较小的相关性),它被广泛地用作各种无线 ...
- HDU 1711 Number Sequence(KMP算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 Number Sequence Time Limit: 10000/5000 MS (Java/ ...
- 【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) ...
- Sequence point 中文
摘自维基百科: In C[4] and C++,[5] sequence points occur in the following places. (In C++, overloaded opera ...
- swift Sequence 和 SubSequence
1 序列 Sequence 序列协议是集合类型结构中的基础. 一个序列是代表有一系列具有相同类型的值,并且对这些值进行迭代. 协议中主要有两个参数,一个是元素Element,一个就是迭代器Iterat ...
- 创新类编辑推荐:Sequence iBPMS平台
创新类编辑推荐是Sequence,一个"iBPMS"工作流管理平台.本文介绍了该产品以及用户是如何成功使用该平台的. SearchSOA的编辑会定期为创新性和市场影响而表彰应用集成 ...
最新文章
- phpcms V9利用num++实现多样形式列表标签调用
- Netbeans and Remote Host for C/C++ Developing
- 2020ICPC(小米邀请赛2) - Data Structure Problem(线段树+树状数组)
- C#退出窗体的总结方法
- 如何对聚类结果进行分析_产品经理如何进行数据分析?
- (原创)如何进行有符号小数乘法运算?(Verilog)
- FREETEXTBOX
- 记录php项目遇到502和504 Bad Gateway问题
- 全链路日志追踪系统介绍与思考
- ElasticJob分布式调度,分布式多个微服务执行只需要执行一个定时任务,基本概念介绍(一)
- Outlook2016邮箱配置说明文档
- 没有寻线仪怎么找网线_乱七八糟的网线怎么找?寻线仪来帮你
- 怎么把微信公众号的文章里的音频或视频下载到电脑和手机
- 美通企业日报 | 四所中国大陆高校进入亚洲大学前十;工作时间过长威胁IT从业人员健康...
- Ubuntu中复制文件出现权限不够的问题
- WRT之Crosswalk简介
- 1024程序员节,向改变世界的程序员致敬
- gbase 8d客户端连接注意事项
- java找茬_一起来找茬(1)-开发写的神奇左连接
- 食品行业渠道商商城系统渠道利益透明,加速企业资金回笼
热门文章
- Java三种连接池(druid、c3p0、dbcp)
- 通过截取实时系统日志查找问题bug的小技巧命令--linux
- Windows下Cesium Terrain Builder编译 (VS2015)
- Java基础之十年面试杂记
- libevent 编程疑难解答
- 39. (附加)二叉树是不是平衡二叉树(C++版本)
- python os.open禁止写入缓存区_Python-设置文件缓冲类型
- android studio继承关系,Android Studio中查看类的继承关系
- Java进阶:Dubbo
- 实战:小程序购物商城