1858

思路:

  恶心;

代码:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define maxn 100005
  4. struct TreeNodeType {
  5. int l,r,l1,r1,m1,l0,r0,m0,mid,size,cnt1,cnt0;
  6. bool f1,f0,ff;
  7. inline void turn(){swap(l1,l0),swap(r1,r0),swap(m1,m0),swap(cnt1,cnt0);}
  8. inline void turn1(){l0=,r0=,m0=,cnt0=,l1=size,r1=size,m1=size,cnt1=size;}
  9. inline void turn0(){l1=,r1=,m1=,cnt1=,l0=size,r0=size,m0=size,cnt0=size;}
  10. inline void F1(){f1=true,f0=false,ff=false;}
  11. inline void F0(){f0=true,f1=false,ff=false;}
  12. inline void FF(){
  13. if(f1) f0=true,f1=false;
  14. else if(f0) f1=true,f0=false;
  15. else ff^=;
  16. }
  17. inline void turnzero(){f1=false,f0=false,ff=false;}
  18. };
  19. struct TreeNodeType tree[maxn<<];
  20. struct AnsType {
  21. int l,r,m,s;
  22. };
  23. int n,m,Count;
  24. inline void in(int &now)
  25. {
  26. char Cget=getchar();now=;
  27. while(Cget>''||Cget<'') Cget=getchar();
  28. while(Cget>=''&&Cget<='') now=now*+Cget-'',Cget=getchar();
  29. }
  30. inline void updata(int now)
  31. {
  32. tree[now].cnt1=tree[now<<].cnt1+tree[now<<|].cnt1;
  33. tree[now].cnt0=tree[now<<].cnt0+tree[now<<|].cnt0;
  34. tree[now].l1=tree[now<<].size==tree[now<<].l1?tree[now<<].l1+tree[now<<|].l1:tree[now<<].l1;
  35. tree[now].l0=tree[now<<].size==tree[now<<].l0?tree[now<<].l0+tree[now<<|].l0:tree[now<<].l0;
  36. tree[now].r1=tree[now<<|].size==tree[now<<|].r1?tree[now<<|].r1+tree[now<<].r1:tree[now<<|].r1;
  37. tree[now].r0=tree[now<<|].size==tree[now<<|].r0?tree[now<<|].r0+tree[now<<].r0:tree[now<<|].r0;
  38. tree[now].m1=max(tree[now<<].r1+tree[now<<|].l1,max(tree[now<<].m1,tree[now<<|].m1));
  39. tree[now].m0=max(tree[now<<].r0+tree[now<<|].l0,max(tree[now<<].m0,tree[now<<|].m0));
  40. }
  41. inline void downdata(int now)
  42. {
  43. if(tree[now].f1) tree[now<<].turn1(),tree[now<<|].turn1(),tree[now<<].F1(),tree[now<<|].F1();
  44. if(tree[now].f0) tree[now<<].turn0(),tree[now<<|].turn0(),tree[now<<].F0(),tree[now<<|].F0();
  45. if(tree[now].ff) tree[now<<].turn(),tree[now<<|].turn(),tree[now<<].FF(),tree[now<<|].FF();
  46. tree[now].turnzero();
  47. }
  48. inline void build(int now,int l,int r)
  49. {
  50. tree[now].l=l,tree[now].r=r,tree[now].size=r-l+;
  51. if(l==r)
  52. {
  53. int pos;
  54. in(pos);
  55. if(pos) tree[now].l1=,tree[now].r1=,tree[now].m1=,tree[now].cnt1=;
  56. else tree[now].l0=,tree[now].r0=,tree[now].m0=,tree[now].cnt0=;
  57. return;
  58. }
  59. tree[now].mid=l+r>>;
  60. build(now<<,l,tree[now].mid);
  61. build(now<<|,tree[now].mid+,r);
  62. updata(now);
  63. }
  64. inline void operation0(int now,int l,int r)
  65. {
  66. if(tree[now].l>=l&&tree[now].r<=r){tree[now].turn0(),tree[now].F0();return;}
  67. if(tree[now].f1||tree[now].f0||tree[now].ff) downdata(now);
  68. if(l<=tree[now].mid) operation0(now<<,l,min(r,tree[now].mid));
  69. if(r>tree[now].mid) operation0(now<<|,max(tree[now].mid+,l),r);
  70. updata(now);
  71. }
  72. inline void operation1(int now,int l,int r)
  73. {
  74. if(tree[now].l>=l&&tree[now].r<=r){tree[now].turn1(),tree[now].F1();return;}
  75. if(tree[now].f1||tree[now].f0||tree[now].ff) downdata(now);
  76. if(l<=tree[now].mid) operation1(now<<,l,min(r,tree[now].mid));
  77. if(r>tree[now].mid) operation1(now<<|,max(tree[now].mid+,l),r);
  78. updata(now);
  79. }
  80. inline void operation2(int now,int l,int r)
  81. {
  82. if(tree[now].l>=l&&tree[now].r<=r){tree[now].turn(),tree[now].FF();return;}
  83. if(tree[now].f1||tree[now].f0||tree[now].ff) downdata(now);
  84. if(l<=tree[now].mid) operation2(now<<,l,min(r,tree[now].mid));
  85. if(r>tree[now].mid) operation2(now<<|,max(tree[now].mid+,l),r);
  86. updata(now);
  87. }
  88. inline void operation3(int now,int l,int r)
  89. {
  90. if(tree[now].l>=l&&tree[now].r<=r){Count+=tree[now].cnt1;return;}
  91. if(tree[now].f1||tree[now].f0||tree[now].ff) downdata(now);
  92. if(l<=tree[now].mid) operation3(now<<,l,min(r,tree[now].mid));
  93. if(r>tree[now].mid) operation3(now<<|,max(l,tree[now].mid+),r);
  94. updata(now);
  95. }
  96. inline AnsType operation4(int now,int l,int r)
  97. {
  98. if(tree[now].l>=l&&tree[now].r<=r) return (AnsType){tree[now].l1,tree[now].r1,tree[now].m1,tree[now].size};
  99. if(tree[now].f1||tree[now].f0||tree[now].ff) downdata(now);
  100. bool al=false,ar=false;AnsType Al,Ar,res;
  101. if(l<=tree[now].mid) al=true,Al=operation4(now<<,l,min(r,tree[now].mid));
  102. if(r>tree[now].mid) ar=true,Ar=operation4(now<<|,max(l,tree[now].mid+),r);
  103. if(al&&ar)
  104. {
  105. res.s=Al.s+Ar.s;
  106. res.l=Al.s==Al.l?Al.l+Ar.l:Al.l;
  107. res.r=Ar.s==Ar.r?Ar.r+Al.r:Ar.r;
  108. res.m=max(Al.r+Ar.l,max(Al.m,Ar.m));
  109. return res;
  110. }
  111. return al?Al:Ar;
  112. }
  113. int main()
  114. {
  115. in(n),in(m),build(,,n-);
  116. int op,l,r;AnsType pos;
  117. while(m--)
  118. {
  119. in(op),in(l),in(r);
  120. if(op==) operation0(,l,r);
  121. if(op==) operation1(,l,r);
  122. if(op==) operation2(,l,r);
  123. if(op==) Count=,operation3(,l,r),printf("%d\n",Count);
  124. if(op==) pos=operation4(,l,r),printf("%d\n",max(max(pos.l,pos.r),pos.m));
  125. }
  126. return ;
  127. }

AC日记——[Scoi2010]序列操作 bzoj 1858的更多相关文章

  1. AC日记——[SCOI2010]幸运数字 bzoj 1853

    1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 2405  Solved: 887[Submit][Status] ...

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

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

  3. (WAWAWAWAWAWA) BZOJ 1858: [Scoi2010]序列操作

    二次联通门 : BZOJ 1858: [Scoi2010]序列操作 /* BZOJ 1858: [Scoi2010]序列操作 已经... 没有什么好怕的的了... 16K的代码... 调个MMP啊.. ...

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

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

  5. 1858: [Scoi2010]序列操作

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

  6. bzoj1858[Scoi2010]序列操作 线段树

    1858: [Scoi2010]序列操作 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 3079  Solved: 1475[Submit][Statu ...

  7. BZOJ_1858_[Scoi2010]序列操作_线段树

    BZOJ_1858_[Scoi2010]序列操作_线段树 Description lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询 ...

  8. 【题解】Luogu P2572 [SCOI2010]序列操作

    原题传送门:P2572 [SCOI2010]序列操作 这题好弱智啊 裸的珂朵莉树 前置芝士:珂朵莉树 窝博客里对珂朵莉树的介绍 没什么好说的自己看看吧 操作1:把区间内所有数推平成0,珂朵莉树基本操作 ...

  9. P2572 [SCOI2010]序列操作

    对自己 & \(RNG\) : 骄兵必败 \(lpl\)加油! P2572 [SCOI2010]序列操作 题目描述 lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要 ...

随机推荐

  1. Java编程MapReduce实现WordCount

    Java编程MapReduce实现WordCount 1.编写Mapper package net.toocruel.yarn.mapreduce.wordcount; import org.apac ...

  2. 【题解】最大公约数之和 V3 51nod 1237 杜教筛

    题目传送门 http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1237 数学题真是做的又爽又痛苦,爽在于只要推出来公式基本上就 ...

  3. HDU1814 2-sat 模板

    Peaceful Commission Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  4. UVA 11040 Add bricks in the wall

    https://vjudge.net/problem/UVA-11040 找规律 #include<cstdio> using namespace std; ][]; int main() ...

  5. UVA 10214 Trees in a Wood

    https://vjudge.net/problem/UVA-10214 题意:你站在原点,每个坐标位置有一棵高度相同的树,问能看到多少棵树 ans=Σ gcd(x,y)=1 欧拉函数搞搞 #incl ...

  6. 修改Maven仓库地址

    在%USERPROFILE%\.m2\settings.xml例如:C:\Users\LongShu\.m2\settings.xml 可以自定义Maven的一些参数, 复制%M2_HOME%\con ...

  7. 【Codeforces370E】Summer Reading [构造]

    Summer Reading Time Limit: 20 Sec  Memory Limit: 512 MB Description Input Output Sample Input 7 0 1 ...

  8. 【HDU】3068 最长回文

    [算法]manacher [题解][算法]字符串 #include<cstdio> #include<algorithm> #include<cstring> us ...

  9. 基本控件文档-UIButton属性---iOS-Apple苹果官方文档翻译

    本系列所有开发文档翻译链接地址:iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址 //转载请注明出处--本文永久链接:http://www.cnblogs.com/Ch ...

  10. 超详细的Java面试题总结(三)之Java集合篇常见问题

    List,Set,Map三者的区别及总结 List:对付顺序的好帮手 List接口存储一组不唯一(可以有多个元素引用相同的对象),有序的对象 Set:注重独一无二的性质 不允许重复的集合.不会有多个元 ...