调了很久的代码。。注意区间翻转和覆盖的操作互相的影响

  1. /*
  2. 区间替换操作怎么搞?
  3. 应该是加个tag标记
  4. 如果整个区间都是0|1,那么把若有tag的话直接set1|0即可,也不用设置tag标记
  5. 反之要设置tag标记,设置了tag标记的区间mx0和mx1要对换
  6. lazy标记可以覆盖tag
  7. mx0,mx1表示区间0,1最大连续,lmx0,lmx1表示区间左连续,rmx0,rmx1表示区间右连续
  8. */
  9. #include<bits/stdc++.h>
  10. using namespace std;
  11. #define maxn 200005
  12. int t,n,m,a[maxn];
  13.  
  14. #define lson l,m,rt<<1
  15. #define rson m+1,r,rt<<1|1
  16. int mx0[maxn<<],mx1[maxn<<],lmx0[maxn<<],rmx0[maxn<<],lmx1[maxn<<],rmx1[maxn<<];
  17. int sum[maxn<<],lazy[maxn<<],tag[maxn<<];
  18. void set0(int l,int r,int rt){tag[rt]=;lazy[rt]=;mx0[rt]=lmx0[rt]=rmx0[rt]=r-l+;sum[rt]=mx1[rt]=lmx1[rt]=rmx1[rt]=;}
  19. void set1(int l,int r,int rt){tag[rt]=;lazy[rt]=;mx0[rt]=lmx0[rt]=rmx0[rt]=;sum[rt]=mx1[rt]=lmx1[rt]=rmx1[rt]=r-l+;}
  20. void rev(int l,int r,int rt){
  21. if(lazy[rt]==)set1(l,r,rt);
  22. else if(lazy[rt]==)set0(l,r,rt);
  23. else {
  24. tag[rt]^=;
  25. sum[rt]=r-l+-sum[rt];
  26. swap(mx0[rt],mx1[rt]);
  27. swap(lmx0[rt],lmx1[rt]);
  28. swap(rmx0[rt],rmx1[rt]);
  29. }
  30. }
  31. void pushup(int l,int r,int rt){
  32. int m=l+r>>;
  33. lmx0[rt]=lmx0[rt<<],rmx0[rt]=rmx0[rt<<|];
  34. mx0[rt]=max(mx0[rt<<],mx0[rt<<|]);
  35. if(rmx0[rt<<]==m-l+)lmx0[rt]=lmx0[rt<<|]+m-l+;
  36. if(lmx0[rt<<|]==r-m)rmx0[rt]=rmx0[rt<<]+r-m;
  37. mx0[rt]=max(mx0[rt],max(lmx0[rt],rmx0[rt]));
  38. mx0[rt]=max(mx0[rt],rmx0[rt<<]+lmx0[rt<<|]);
  39.  
  40. lmx1[rt]=lmx1[rt<<],rmx1[rt]=rmx1[rt<<|];
  41. mx1[rt]=max(mx1[rt<<],mx1[rt<<|]);
  42. if(rmx1[rt<<]==m-l+)lmx1[rt]=lmx1[rt<<|]+m-l+;
  43. if(lmx1[rt<<|]==r-m)rmx1[rt]=rmx1[rt<<]+r-m;
  44. mx1[rt]=max(mx1[rt],max(lmx1[rt],rmx1[rt]));
  45. mx1[rt]=max(mx1[rt],rmx1[rt<<]+lmx1[rt<<|]);
  46.  
  47. sum[rt]=sum[rt<<]+sum[rt<<|];
  48. }
  49. void pushdown(int l,int r,int rt){
  50. int m=l+r>>;
  51. if(lazy[rt]==){set0(lson);set0(rson);lazy[rt]=-;return;}
  52. else if(lazy[rt]==){set1(lson),set1(rson);lazy[rt]=-;return;}
  53. else if(tag[rt]){rev(lson);rev(rson);tag[rt]=;return;}
  54. }
  55. void build(int l,int r,int rt){
  56. lazy[rt]=-;
  57. tag[rt]=sum[rt]=;
  58. if(l==r){
  59. if(a[l]==){mx0[rt]=lmx0[rt]=rmx0[rt]=;mx1[rt]=lmx1[rt]=rmx1[rt]=;}
  60. else{mx0[rt]=lmx0[rt]=rmx0[rt]=;mx1[rt]=lmx1[rt]=rmx1[rt]=sum[rt]=;}
  61. return;
  62. }
  63. int m=l+r>>;
  64. build(lson);build(rson);
  65. pushup(l,r,rt);
  66. }
  67. void update0(int L,int R,int l,int r,int rt){
  68. if(L<=l && R>=r){set0(l,r,rt);return;}
  69. int m=l+r>>;
  70. pushdown(l,r,rt);
  71. if(L<=m)update0(L,R,lson);
  72. if(R>m)update0(L,R,rson);
  73. pushup(l,r,rt);
  74. }
  75. void update1(int L,int R,int l,int r,int rt){
  76. if(L<=l && R>=r){set1(l,r,rt);return;}
  77. int m=l+r>>;
  78. pushdown(l,r,rt);
  79. if(L<=m)update1(L,R,lson);
  80. if(R>m)update1(L,R,rson);
  81. pushup(l,r,rt);
  82. }
  83. void update2(int L,int R,int l,int r,int rt){
  84. if(L<=l && R>=r){rev(l,r,rt);return;}
  85. int m=l+r>>;
  86. pushdown(l,r,rt);
  87. if(L<=m)update2(L,R,lson);
  88. if(R>m)update2(L,R,rson);
  89. pushup(l,r,rt);
  90. }
  91. int query1(int L,int R,int l,int r,int rt){
  92. if(L<=l &&R>=r){return sum[rt];}
  93. int m=l+r>>,res=;
  94. pushdown(l,r,rt);
  95. if(L<=m)res+=query1(L,R,lson);
  96. if(R>m)res+=query1(L,R,rson);
  97. pushup(l,r,rt);
  98. return res;
  99. }
  100. int query2(int L,int R,int l,int r,int rt){
  101. if(L<=l && R>=r){return mx1[rt];}
  102. int m=l+r>>;
  103. pushdown(l,r,rt);
  104. if(R<=m)return query2(L,R,lson);
  105. else if(L>m)return query2(L,R,rson);
  106. else {
  107. int t1=query2(L,R,lson),t2=query2(L,R,rson);
  108. int t3=max(t1,t2);
  109. return max(t3,min(rmx1[rt<<],m-L+)+min(lmx1[rt<<|],R-m));
  110. }
  111. pushup(l,r,rt);
  112. }
  113.  
  114. int main(){
  115. cin>>t;
  116. while(t--){
  117. cin>>n>>m;
  118. for(int i=;i<n;i++)cin>>a[i];
  119. build(,n-,);
  120. while(m--){
  121. int opt,l,r;
  122. cin>>opt>>l>>r;
  123. //l++,r++;
  124. if(opt==)update0(l,r,,n-,);
  125. if(opt==)update1(l,r,,n-,);
  126. if(opt==)update2(l,r,,n-,);
  127. if(opt==)cout<<query1(l,r,,n-,)<<'\n';
  128. if(opt==)cout<<query2(l,r,,n-,)<<'\n';
  129. }
  130. }
  131. }

hdu3397区间覆盖,区间翻转,区间合并,区间求和的更多相关文章

  1. HDU 3397 区间覆盖,颠倒,合并(好题)

    http://acm.hust.edu.cn/vjudge/problem/14689 三个操作 [a,b]覆盖为0 [a,b]覆盖为1 [a,b]颠倒每项 两个查询 [a,b]间1数量 [a,b]间 ...

  2. 牛客挑战赛40 VMware和基站 set 二分 启发式合并 区间覆盖

    LINK:VMware和基站 一道 做法并不常见的题目 看起来很难写 其实set维护线段就可以解决了. 容易想到 第二个操作借用启发式合并可以得到一个很不错的复杂度 不过利用线段树维护这个东西 在区间 ...

  3. 【区间覆盖问题】uva 10020 - Minimal coverage

    可以说是区间覆盖问题的例题... Note: 区间包含+排序扫描: 要求覆盖区间[s, t]; 1.把各区间按照Left从小到大排序,如果区间1的起点大于s,则无解(因为其他区间的左起点更大):否则选 ...

  4. nyoj 12——喷水装置二——————【贪心-区间覆盖】

    喷水装置(二) 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的 ...

  5. 洛谷P2439 [SDOI2005]阶梯教室设备利用(带权区间覆盖)

    题目背景 我们现有许多演讲要在阶梯教室中举行.每一个演讲都可以用唯一的起始和终止时间来确定,如果两个演讲时间有部分或全部重复,那么它们是无法同时在阶级教室中举行的.现在我们想要尽最大可能的利用这个教室 ...

  6. 51nod 1091 线段的重叠【贪心/区间覆盖类】

    1091 线段的重叠 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题  收藏  关注 X轴上有N条线段,每条线段包括1个起点和终点.线段的重叠是这样来算的,[10 2 ...

  7. Cleaning Shifts(区间覆盖)

    /* http://acm.hdu.edu.cn/webcontest/contest_showproblem.php?pid=1019&ojid=1&cid=10 题目: 给定一个时 ...

  8. [LeetCode] Merge Intervals 合并区间

    Given a collection of intervals, merge all overlapping intervals. For example, Given [1,3],[2,6],[8, ...

  9. HDU 4509 湫湫系列故事——减肥记II(线段树-区间覆盖 或者 暴力技巧)

    http://acm.hdu.edu.cn/showproblem.php?pid=4509 题目大意: 中文意义,应该能懂. 解题思路: 因为题目给的时间是一天24小时,而且还有分钟.为了解题方便, ...

随机推荐

  1. 部署python django程序

    在一台新的服务器上x需要先安装python3  ,git , 等 安装python3 安装python3 之前博客写过 创建虚拟环境,我用的是venv https://docs.python.org/ ...

  2. P4147 玉蟾宫

    P4147 玉蟾宫 给定一个 \(N * M\) 的矩阵 求最大的全为 \(F\) 的子矩阵 Solution 悬线法 限制条件为转移来的和现在的都为 \(F\) Code #include<i ...

  3. MySQL_help语句(不定时更新)

    1.使用delimiter 命令重新定义mysql 的默认语句分隔符 delimiter $

  4. 【转载】关闭XenServer中挂起(hang)虚机的方法

    在XenServer中,碰到VM挂起(hang)的情况,也不是那么少见,而VM长时间挂起,那么很影响心情和后续的操作. 一般情况下,为了关闭VM或者重启VM,我们推荐这样的操作顺序: 进入到VM内,使 ...

  5. Python基础【day01】:表达式if ...else语句(三)

    本节内容 用户输入 表达式if ...else语句 作业需求 一.用户输入 1 2 3 4 5 6 7 #!/usr/bin/env python #_*_coding:utf-8_*_     #n ...

  6. MVC模块化开发方案

    核心: 主要利用MVC的区域功能,实现项目模块独立开发和调试. 目标: 各个模块以独立MVC应用程序存在,即模块可独立开发和调试. 动态注册各个模块路由. 一:新建解决方案目录结构 如图: 二:Eas ...

  7. bzoj千题计划307:bzoj5248: [2018多省省队联测]一双木棋

    https://www.lydsy.com/JudgeOnline/problem.php?id=5248 先手希望先手得分减后手得分最大,后手希望先手得分减后手得分最小 棋盘的局面一定是阶梯状,且从 ...

  8. HITS算法--从原理到实现

    本文介绍HITS算法的相关内容. 1.算法来源 2.算法原理 3.算法证明 4.算法实现 4.1 基于迭代法的简单实现 4.2 MapReduce实现 5.HITS算法的缺点 6.写在最后 参考资料 ...

  9. intellj(idea) 编译项目时在warnings 页签框里 报 “xxx包不存在” 或 “找不到符号” 或 “未结束的字符串字面值” 或 “需要)” 或 “需要;”等错误提示

    如上图: 环境 是 刚换的系统,重装的Intellj,直接双击老的皇帝项目中的idea的 .iml文件,结果 打开 intellj 后,进行 ctrl +shift +F9 编译时 尽然报 错误提示, ...

  10. luogu P3960 列队

    传送门 因为\(Splay\)可以\(O(logn)\)维护区间,所以直接对每一行维护第一个元素到倒数第二个元素的\(Splay\),最后一列维护一个\(Splay\),每次把选出来的点删掉,然后把那 ...