题面

线段树......模板题(雾?

然而两种标记会互相影响,必须保证每次只放一个(不然就不知道怎么放了),具体的影响就是:

翻转标记会使得覆盖标记一起翻转,下放的时候就是各种swap

覆盖标记会抹掉翻转标记,下放的时候好像挺正常的

然后就是码码码+细节

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. const int N=;
  6. struct a{int ll,rr,vv;};
  7. int val[*N],last[*N][],lst[*N][],rst[*N][];
  8. int num[N],laz1[*N],laz2[*N];
  9. int n,m,t1,t2,t3;
  10. void pushup(int nde,int l,int r)
  11. {
  12. int mid=(l+r)/,ls=*nde,rs=*nde+;
  13. val[nde]=val[ls]+val[rs];
  14. //value
  15. lst[nde][]=(last[ls][]==mid-l+)?last[ls][]+lst[rs][]:lst[ls][];
  16. rst[nde][]=(last[rs][]==r-mid)?last[rs][]+rst[ls][]:rst[rs][];
  17. last[nde][]=max(rst[ls][]+lst[rs][],max(last[ls][],last[rs][]));
  18. //longest continuing one
  19. lst[nde][]=(last[ls][]==mid-l+)?last[ls][]+lst[rs][]:lst[ls][];
  20. rst[nde][]=(last[rs][]==r-mid)?last[rs][]+rst[ls][]:rst[rs][];
  21. last[nde][]=max(rst[ls][]+lst[rs][],max(last[ls][],last[rs][]));
  22. //longest continuing zero
  23. }
  24. void create(int nde,int l,int r)
  25. {
  26. if(l==r)
  27. {
  28. last[nde][]=lst[nde][]=rst[nde][]=(num[l]^);
  29. val[nde]=last[nde][]=lst[nde][]=rst[nde][]=num[l];
  30. }
  31. else
  32. {
  33. int mid=(l+r)/,ls=*nde,rs=*nde+;
  34. create(ls,l,mid),create(rs,mid+,r);
  35. pushup(nde,l,r);
  36. }
  37. }
  38. void release(int nde,int l,int r)
  39. {
  40. int mid=(l+r)/,ls=*nde,rs=*nde+;
  41. if(laz2[nde])
  42. {
  43. if(~laz1[ls]) laz1[ls]^=; else laz2[ls]^=;
  44. if(~laz1[rs]) laz1[rs]^=; else laz2[rs]^=;
  45. val[ls]=(mid-l+)-val[ls],val[rs]=(r-mid)-val[rs];
  46. //reversing
  47. swap(last[ls][],last[ls][]),swap(last[rs][],last[rs][]);
  48. swap(lst[ls][],lst[ls][]),swap(lst[rs][],lst[rs][]);
  49. swap(rst[ls][],rst[ls][]),swap(rst[rs][],rst[rs][]);
  50. //a lot of swaps......
  51. laz2[nde]=;
  52. //refresh
  53. }
  54. //release the lazy tag of intervals reversing
  55. else if(~laz1[nde])
  56. {
  57. laz1[ls]=laz1[nde],laz1[rs]=laz1[nde],laz2[ls]=,laz2[rs]=;
  58. //to the left/right son
  59. val[ls]=last[ls][]=lst[ls][]=rst[ls][]=(mid-l+)*laz1[nde];
  60. val[rs]=last[rs][]=lst[rs][]=rst[rs][]=(r-mid)*laz1[nde];
  61. //longest continuing one
  62. last[ls][]=lst[ls][]=rst[ls][]=(mid-l+)*(laz1[nde]^);
  63. last[rs][]=lst[rs][]=rst[rs][]=(r-mid)*(laz1[nde]^);
  64. //longest continuing zero
  65. laz1[nde]=-;
  66. //refresh
  67. }
  68. //release the lazy tag of intervals covering
  69. }
  70. void Change(int nde,int l,int r,int nl,int nr,int task)
  71. {
  72. if(l>nr||r<nl)
  73. return ;
  74. else if(l>=nl&&r<=nr)
  75. {
  76. last[nde][]=lst[nde][]=rst[nde][]=(task^)*(r-l+);
  77. val[nde]=last[nde][]=lst[nde][]=rst[nde][]=task*(r-l+);
  78. laz1[nde]=task,laz2[nde]=;
  79. }
  80. else
  81. {
  82. int mid=(l+r)/,ls=*nde,rs=*nde+; release(nde,l,r);
  83. Change(ls,l,mid,nl,nr,task),Change(rs,mid+,r,nl,nr,task);
  84. pushup(nde,l,r);
  85. }
  86. }
  87. void Reverse(int nde,int l,int r,int nl,int nr)
  88. {
  89. if(l>nr||r<nl)
  90. return ;
  91. else if(l>=nl&&r<=nr)
  92. {
  93. val[nde]=(r-l+)-val[nde],swap(last[nde][],last[nde][]);
  94. swap(lst[nde][],lst[nde][]),swap(rst[nde][],rst[nde][]);
  95. if(~laz1[nde]) laz1[nde]^=; else laz2[nde]^=;
  96. }
  97. else
  98. {
  99. int mid=(l+r)/,ls=*nde,rs=*nde+; release(nde,l,r);
  100. Reverse(ls,l,mid,nl,nr),Reverse(rs,mid+,r,nl,nr); pushup(nde,l,r);
  101. }
  102. }
  103. int Vquery(int nde,int l,int r,int nl,int nr)
  104. {
  105. if(l>nr||r<nl)
  106. return ;
  107. else if(l>=nl&&r<=nr)
  108. return val[nde];
  109. else
  110. {
  111. int mid=(l+r)/,ls=*nde,rs=*nde+; release(nde,l,r);
  112. return Vquery(ls,l,mid,nl,nr)+Vquery(rs,mid+,r,nl,nr);
  113. }
  114. }
  115. a Lquery(int nde,int l,int r,int nl,int nr)
  116. {
  117. if(l>=nl&&r<=nr)
  118. return (a){lst[nde][],rst[nde][],last[nde][]};
  119. else
  120. {
  121. int mid=(l+r)/,ls=*nde,rs=*nde+; release(nde,l,r);
  122. if(nr<=mid) return Lquery(ls,l,mid,nl,nr);
  123. if(nl>mid) return Lquery(rs,mid+,r,nl,nr);
  124. a Q1=Lquery(ls,l,mid,nl,nr),Q2=Lquery(rs,mid+,r,nl,nr),ret;
  125. ret.vv=max(max(Q1.vv,Q2.vv),Q1.rr+Q2.ll);
  126. ret.ll=(Q1.vv==(mid-l+))?Q1.vv+Q2.ll:Q1.ll;
  127. ret.rr=(Q2.vv==(r-mid))?Q2.vv+Q1.rr:Q2.rr;
  128. return ret;
  129. }
  130. }
  131. int main ()
  132. {
  133. scanf("%d%d",&n,&m);
  134. for(int i=;i<=n;i++)
  135. scanf("%d",&num[i]);
  136. create(,,n);
  137. memset(laz1,-,sizeof laz1);
  138. for(int i=;i<=m;i++)
  139. {
  140. scanf("%d%d%d",&t1,&t2,&t3),t2++,t3++;
  141. if(!t1) Change(,,n,t2,t3,);
  142. else if(t1==) Change(,,n,t2,t3,);
  143. else if(t1==) Reverse(,,n,t2,t3);
  144. else if(t1==) printf("%d\n",Vquery(,,n,t2,t3));
  145. else printf("%d\n",Lquery(,,n,t2,t3).vv);
  146. }
  147. return ;
  148. }

解题:SCOI 2010 序列操作的更多相关文章

  1. SCOI 2010 序列操作

    题目描述 lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询问操作: 0 a b 把[a, b]区间内的所有数全变成0 1 a b ...

  2. SCOI2010 序列操作

    2421 序列操作 http://codevs.cn/problem/2421/ 2010年省队选拔赛四川   题目描述 Description lxhgww最近收到了一个01序列,序列里面包含了n个 ...

  3. 1858: [Scoi2010]序列操作

    1858: [Scoi2010]序列操作 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 3397 Solved: 1624 [Submit][Statu ...

  4. Python通用序列操作

    1.序列概览 1.数据结构 序列.容器 Python中最基本的数据结构是序列,其有索引(从左到右第一个索引为0,从右到左第一个索引为-1). Python包含6中内建的序列: 列表 元组 字符串 Un ...

  5. 【BZOJ-2962】序列操作 线段树 + 区间卷积

    2962: 序列操作 Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 678  Solved: 246[Submit][Status][Discuss] ...

  6. 【BZOJ-1858】序列操作 线段树

    1858: [Scoi2010]序列操作 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1961  Solved: 991[Submit][Status ...

  7. bzoj 1858: [Scoi2010]序列操作

    1858: [Scoi2010]序列操作 Time Limit: 10 Sec  Memory Limit: 64 MB 线段树,对于每个区间需要分别维护左右和中间的1和0连续个数,并在op=4时特殊 ...

  8. BZOJ 1858: [Scoi2010]序列操作( 线段树 )

    略恶心的线段树...不过只要弄清楚了AC应该不难.... ---------------------------------------------------------------- #inclu ...

  9. [bzoj]2962序列操作

    [bzoj]2962序列操作 标签: 线段树 题目链接 题意 给你一串序列,要你维护三个操作: 1.区间加法 2.区间取相反数 3.区间内任意选k个数相乘的积 题解 第三个操作看起来一脸懵逼啊. 其实 ...

随机推荐

  1. mysql innodb 从 ibd 文件恢复表数据

    最近内部的 mysql 数据库发生了一件奇怪的事,其中有一个表 users625 突然出现问题, 所有对它的操作都报错误 数据表不存在. mysql> select count(*) from ...

  2. 【Ansible】ansible 任务失败控制

    任务失败控制 Ansible 通常默认会确保检测模块和命令的返回码并且会快速失败 – 专注于一个错误除非你另作打算. 有时一条命令会返回 0 但那不是报错.有时命令不会总是报告它 ‘改变’ 了远程系统 ...

  3. [朴孝敏][Sketch]

    歌词来源:http://music.163.com/#/song?id=406907303 作曲 : Ryan S. Jhun/August Rigo/Denzil Remedios [作曲 : Ry ...

  4. Appengine直接下载文件并保存到google drive

    一直对下载文件比较感兴趣.前些日子无意搜到google 推出一项服务,可以直接将文件下载到google drive中,原型猛戳这里,但有限额限制.一时脑洞大开,可不可以在appengine 上架设服务 ...

  5. Django_rest_framework_组件(authentication、permission、throttle)

    认证组件 说明 from rest_framework.authentication import BaseAuthentication class TestAuthentication(BaseAu ...

  6. 奔跑吧DKY——团队Scrum冲刺阶段博客汇总

    第一周:团队展示 团队选题 需求规格说明书 第二周:完善需求规格说明书.制定团队编码规范.通过团队项目数据库设计 奔跑吧DKY--团队Scrum冲刺阶段-Day 1-领航 奔跑吧DKY--团队Scru ...

  7. 【动态规划】POJ-2385

    一.题目 Description It is a little known fact that cows love apples. Farmer John has two apple trees (w ...

  8. HttpContext.Current.Server.MapPath("/") 未将对象设置到对象的实例异常。

    多线程中的System.Web.HttpContext.Current.Server.MapPath("/") 多线程中Server.MapPath会失效... 网上找到几种解决方 ...

  9. C51中的关键字data,idata,xdata,pdata,bdata

    写在最前面的话:官方网站的解答是最可信的.英语不错的必看.http://www.keil.com/support/man/docs/c51/c51_le_memtypes.htm 下面转载几篇中文的, ...

  10. mysubmail 短信报警

    https://www.mysubmail.com/chs/documents/developer/YPWD84   文本文档  官网:www.mysubmail.com 操作流程:快速接入短信 AP ...