F - Sequence operation

  1.  
  2. 题解:
    这个题目不是一个特别难的题目,但是呢,写了好久,首先线段树难敲,其次就是bug难找,最后这个代码都被我改的乱七八糟的了,
    这个有两个地方要注意一下,一个是取反的lazy标志,每次取反都是对1取异或,还有一个也是这个取反的lazy标志,
    这个标志再第一种操作之后要进行消除。
  3.  
  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <queue>
  4. #include <algorithm>
  5. #include <vector>
  6. #include <cstring>
  7. #include <string>
  8. #include <iostream>
  9. #include <stack>
  10. #define inf 0x3f3f3f3f
  11. using namespace std;
  12. const int maxn = 1e6 + ;
  13. struct node
  14. {
  15. int sum;
  16. int max_sub, max_zero;
  17. int l, r, len;
  18. int lazy1, lazy2;
  19. int max_prezero, max_lastzero;
  20. int max_preone, max_lastone;
  21. }tree[maxn * ];
  22. int a[maxn];
  23.  
  24. void push_up(int id)
  25. {
  26. tree[id].sum = tree[id << ].sum + tree[id << | ].sum;
  27.  
  28. tree[id].max_preone = tree[id << ].max_preone;
  29. if (tree[id].max_preone == tree[id << ].len) tree[id].max_preone += tree[id << | ].max_preone;
  30. tree[id].max_lastone = tree[id << | ].max_lastone;
  31. if (tree[id].max_lastone == tree[id << | ].len) tree[id].max_lastone += tree[id << ].max_lastone;
  32. tree[id].max_sub = max(tree[id << ].max_lastone + tree[id << | ].max_preone, max(tree[id << ].max_sub, tree[id << | ].max_sub));
  33.  
  34. tree[id].max_prezero = tree[id << ].max_prezero;
  35. if (tree[id].max_prezero == tree[id << ].len) tree[id].max_prezero += tree[id << | ].max_prezero;
  36. tree[id].max_lastzero = tree[id << | ].max_lastzero;
  37. if (tree[id].max_lastzero == tree[id << | ].len) tree[id].max_lastzero += tree[id << ].max_lastzero;
  38. tree[id].max_zero = max(tree[id << ].max_lastzero + tree[id << | ].max_prezero, max(tree[id << ].max_zero, tree[id << | ].max_zero));
  39.  
  40. return;
  41. }
  42.  
  43. void chang1(int id, int val)
  44. {
  45. if (val)
  46. {
  47. tree[id].sum = tree[id].len;
  48. tree[id].max_preone = tree[id].max_lastone = tree[id].max_sub = tree[id].len;
  49. tree[id].max_zero = tree[id].max_prezero = tree[id].max_lastzero = ;
  50. }
  51. else
  52. {
  53. tree[id].sum = ;
  54. tree[id].max_preone = tree[id].max_lastone = tree[id].max_sub = ;
  55. tree[id].max_zero = tree[id].max_prezero = tree[id].max_lastzero = tree[id].len;
  56. }
  57. }
  58.  
  59. void chang2(int id)
  60. {
  61. swap(tree[id].max_sub, tree[id].max_zero);
  62. swap(tree[id].max_prezero, tree[id].max_preone);
  63. swap(tree[id].max_lastone, tree[id].max_lastzero);
  64. tree[id].sum = tree[id].len - tree[id].sum;
  65. }
  66.  
  67. void push_down(int id)
  68. {
  69. if (tree[id].lazy1)
  70. {
  71. chang1(id << , tree[id].lazy1 - );
  72. chang1(id << | , tree[id].lazy1 - );
  73. tree[id << ].lazy1 = tree[id << | ].lazy1 = tree[id].lazy1;
  74. tree[id << ].lazy2 =tree[id << | ].lazy2 = ;
  75. tree[id].lazy1 = ;
  76. }
  77. if (tree[id].lazy2)
  78. {
  79. chang2(id << );
  80. chang2(id << | );
  81.  
  82. tree[id << ].lazy2 ^= ;
  83. tree[id << | ].lazy2 ^= ;
  84. tree[id].lazy2 = ;
  85. }
  86. }
  87.  
  88. void build(int id, int l, int r)
  89. {
  90. tree[id].l = l;
  91. tree[id].r = r;
  92. tree[id].lazy1 = ;
  93. tree[id].lazy2 = ;
  94. tree[id].len = r - l + ;
  95. if (l == r)
  96. {
  97. if (a[l]) chang1(id, );
  98. else chang1(id, );
  99. return;
  100. }
  101. int mid = (l + r) >> ;
  102. build(id << , l, mid);
  103. build(id << | , mid + , r);
  104. push_up(id);
  105. }
  106.  
  107. void update_change(int id, int l, int r, int z)
  108. {
  109. if (l <= tree[id].l&&r >= tree[id].r)
  110. {
  111. chang1(id, z);
  112. tree[id].lazy1 = z + ;
  113. tree[id].lazy2 = ;
  114. return;
  115. }
  116. push_down(id);
  117. int mid = (tree[id].l + tree[id].r) >> ;
  118. if (l <= mid) update_change(id << , l, r, z);
  119. if (r > mid) update_change(id << | , l, r, z);
  120. push_up(id);
  121. }
  122.  
  123. void update_trans(int id, int l, int r)
  124. {
  125. if (l <= tree[id].l&&r >= tree[id].r)
  126. {
  127. tree[id].lazy2 ^= ;
  128. chang2(id);
  129. return;
  130. }
  131. push_down(id);
  132. int mid = (tree[id].l + tree[id].r) >> ;
  133. if (l <= mid) update_trans(id << , l, r);
  134. if (r > mid) update_trans(id << | , l, r);
  135. push_up(id);
  136. }
  137.  
  138. int query_sum(int id, int l, int r)
  139. {
  140. if (l <= tree[id].l&&r >= tree[id].r)
  141. {
  142. return tree[id].sum;
  143. }
  144. push_down(id);
  145. int mid = (tree[id].l + tree[id].r) >> , ans = ;
  146. if (l <= mid) ans += query_sum(id << , l, r);
  147. if (r > mid) ans += query_sum(id << | , l, r);
  148. return ans;
  149. }
  150.  
  151. int query(int id, int l, int r)
  152. {
  153. int ans = ;
  154. if (l <= tree[id].l&&r >= tree[id].r)
  155. {
  156. return tree[id].max_sub;
  157. }
  158. push_down(id);
  159. int mid = (tree[id].l + tree[id].r) >> ;
  160. if (l <= mid) ans = max(ans, query(id << , l, r));
  161. if (r > mid) ans = max(ans, query(id << | , l, r));
  162. ans = max(ans, min(mid - l + , tree[id << ].max_lastone) + min(r - mid, tree[id << | ].max_preone));
  163. return ans;
  164. }
  165.  
  166. int main()
  167. {
  168. int t;
  169. cin >> t;
  170. while (t--)
  171. {
  172. int n, m;
  173. cin >> n >> m;
  174. for (int i = ; i <= n; i++) scanf("%d", &a[i]);
  175. build(, , n);
  176. while (m--)
  177. {
  178. int c, x, y;
  179. scanf("%d%d%d", &c, &x, &y);
  180. if (c == ) update_change(, x + , y + , );
  181. if (c == ) update_change(, x + , y + , );
  182. if (c == ) update_trans(, x + , y + );
  183. if (c == )
  184. {
  185. int ans = query_sum(, x + , y + );
  186. printf("%d\n", ans);
  187. }
  188. if (c == )
  189. {
  190. int ans = query(, x + , y + );
  191. printf("%d\n", ans);
  192. }
  193. }
  194. }
  195. return ;
  196. }
  1.  

线段树 区间合并 F - Sequence operation的更多相关文章

  1. HYSBZ 1858 线段树 区间合并

    //Accepted 14560 KB 1532 ms //线段树 区间合并 /* 0 a b 把[a, b]区间内的所有数全变成0 1 a b 把[a, b]区间内的所有数全变成1 2 a b 把[ ...

  2. poj3667 线段树 区间合并

    //Accepted 3728 KB 1079 ms //线段树 区间合并 #include <cstdio> #include <cstring> #include < ...

  3. hdu3911 线段树 区间合并

    //Accepted 3911 750MS 9872K //线段树 区间合并 #include <cstdio> #include <cstring> #include < ...

  4. SPOJ GSS1_Can you answer these queries I(线段树区间合并)

    SPOJ GSS1_Can you answer these queries I(线段树区间合并) 标签(空格分隔): 线段树区间合并 题目链接 GSS1 - Can you answer these ...

  5. 树链剖分——线段树区间合并bzoj染色

    线段树区间合并就挺麻烦了,再套个树链就更加鬼畜,不过除了代码量大就没什么其他的了.. 一些细节:线段树每个结点用结构体保存,pushup等合并函数改成返回一个结构体,这样好写一些 struct Seg ...

  6. poj3667 Hotel (线段树 区间合并)

    poj3667 HotelTime Limit: 3000MS Memory Limit: 65536KTotal Submissions: 18925 Accepted: 8242Descripti ...

  7. hdu-3308 LCIS (线段树区间合并)

    LCIS Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  8. Tunnel Warfare(HDU1540+线段树+区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1540 题目: 题意:总共有n个村庄,有q次操作,每次操作分为摧毁一座村庄,修复一座村庄,和查询与询问的 ...

  9. hdu 3308(线段树区间合并)

    LCIS Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

随机推荐

  1. git如何清除远程 __pycahce__ 文件

    第一步,清除已经存在的缓存文件 >> git rm -r -f --cached */__pycache__ rm 'common/__pycache__/__init__.cpython ...

  2. Python——flask漏洞探究

    python的用途是真的多,就连网站也能做,这个有点像Java的Servlet flask基础 hello world 我们先从基础的开始,在网页上打出hello world,python代码如下: ...

  3. Android MonkeyTalk测试

    Android MonkeyTalk测试 MonkeyTalk可以用于压力测试,正因为这点所以才选择MonkeyTalk进行测试,相对于Monkey测试,目前个人发现的有点在于,MonkeyTalk是 ...

  4. Css3 新增的属性以及使用

    Css3基础操作 . Css3? css3事css的最新版本 width. heith.background.border**都是属于css2.1CSS3会保留之前 CSS2.1的内容,只是添加了一些 ...

  5. Julia的基本知识

    知识来源 1.变量.整数和浮点数 Julia和Matllab挺像的,基本的变量,数值定义都差不多,所以就没必要记录了. 2.数学运算 3.函数

  6. unity使用Animator做一个简单的动画

    1.在unity的物体上添加Animator组件 2.在Project下的Assets下添加Animator Controller 3.在Animator Controller添加动作 4.在动作之间 ...

  7. 如何假装黑客,使用python去批量破解朋友的网站密码

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http ...

  8. D. Points in rectangle

    D. Points in rectangle 单点时限: 2.0 sec 内存限制: 512 MB 在二维平面中有一个矩形,它的四个坐标点分别为(0,a),(a,0),(n,n−a),(n−a,n). ...

  9. Python之疑难杂症包安装

    ansible 直接用pip install 安装一直失败 1.下载ansible压缩包 https://files.pythonhosted.org/packages/ec/ee/1494474b5 ...

  10. css 样式中 margin padding和top类定位的区别

    1 margin margin 是外边距的意思,是边框到外部另一元素之间的距离,允许使用负值 语法结构: margin:5px auto;                  意思上下为5,左右平均居中 ...