Black And White

Time Limit: 3000ms
Memory Limit: 32768KB

This problem will be judged on HDU. Original ID: 3911
64-bit integer IO format: %I64d      Java class name: Main

There are a bunch of stones on the beach; Stone color is white or black. Little Sheep has a magic brush, she can change the color of a continuous stone, black to white, white to black. Little Sheep like black very much, so she want to know the longest period of consecutive black stones in a range [i, j].

 

Input

  There are multiple cases, the first line of each case is an integer n(1<= n <= 10^5), followed by n integer 1 or 0(1 indicates black stone and 0 indicates white stone), then is an integer M(1<=M<=10^5) followed by M operations formatted as x i j(x = 0 or 1) , x=1 means change the color of stones in range[i,j], and x=0 means ask the longest period of consecutive black stones in range[i,j]

 

Output

When x=0 output a number means the longest length of black stones in range [i,j].

 

Sample Input

  1. 4
  2. 1 0 1 0
  3. 5
  4. 0 1 4
  5. 1 2 3
  6. 0 1 4
  7. 1 3 3
  8. 0 4 4

Sample Output

  1. 1
  2. 2
  3. 0

Source

 
解题:线段树啊。。。幸好只有一种操作,翻转啊。。。
 
就是给你两种操作,1 a b表示将a b区里面的01翻转,0 a b表示输出a b间连续的最长的1有多少个
 
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = ;
  4. struct node {
  5. int lsum[],rsum[],mx[];
  6. bool lazy;
  7. } tree[maxn<<];
  8. void pushup(int v,int k) {
  9. for(int i = ; i < ; ++i) {
  10. tree[v].lsum[i] = tree[v<<].lsum[i];
  11. tree[v].rsum[i] = tree[v<<|].rsum[i];
  12. if(tree[v].lsum[i] == k - (k>>))
  13. tree[v].lsum[i] += tree[v<<|].lsum[i];
  14. if(tree[v].rsum[i] == (k>>))
  15. tree[v].rsum[i] += tree[v<<].rsum[i];
  16. tree[v].mx[i] = max(tree[v<<].mx[i],tree[v<<|].mx[i]);
  17. tree[v].mx[i] = max(tree[v].mx[i],tree[v<<].rsum[i]+tree[v<<|].lsum[i]);
  18. }
  19. }
  20.  
  21. void change(int v) {
  22. swap(tree[v].lsum[],tree[v].lsum[]);
  23. swap(tree[v].rsum[],tree[v].rsum[]);
  24. swap(tree[v].mx[],tree[v].mx[]);
  25. tree[v].lazy = !tree[v].lazy;
  26. }
  27. void pushdown(int v) {
  28. if(tree[v].lazy) {
  29. change(v<<);
  30. change(v<<|);
  31. tree[v].lazy = false;
  32. }
  33. }
  34. void build(int L,int R,int v) {
  35. tree[v].lazy = false;
  36. if(L == R) {
  37. int tmp;
  38. scanf("%d",&tmp);
  39. tree[v].mx[] = tree[v].lsum[] = tree[v].rsum[] = !tmp;
  40. tree[v].mx[] = tree[v].lsum[] = tree[v].rsum[] = tmp;
  41. return;
  42. }
  43. int mid = (L + R)>>;
  44. build(L,mid,v<<);
  45. build(mid+,R,v<<|);
  46. pushup(v,R - L + );
  47. }
  48. void update(int L,int R,int lt,int rt,int v) {
  49. if(lt <= L && rt >= R) {
  50. change(v);
  51. return;
  52. }
  53. pushdown(v);
  54. int mid = (L + R)>>;
  55. if(lt <= mid) update(L,mid,lt,rt,v<<);
  56. if(rt > mid) update(mid+,R,lt,rt,v<<|);
  57. pushup(v,R - L + );
  58. }
  59. int query(int L,int R,int lt,int rt,int v) {
  60. if(lt <= L && rt >= R) return tree[v].mx[];
  61. pushdown(v);
  62. int mid = (L + R)>>,ret = ;
  63. if(lt <= mid) ret = max(ret,query(L,mid,lt,rt,v<<));
  64. if(rt > mid) ret = max(ret,query(mid+,R,lt,rt,v<<|));
  65. if(lt <= mid && rt > mid)
  66. ret = max(ret,min(mid - lt + ,tree[v<<].rsum[]) + min(rt - mid,tree[v<<|].lsum[]));
  67. pushup(v,R - L + );
  68. return ret;
  69. }
  70. int main() {
  71. int n,m,op,a,b;
  72. while(~scanf("%d",&n)){
  73. build(,n,);
  74. scanf("%d",&m);
  75. while(m--){
  76. scanf("%d %d %d",&op,&a,&b);
  77. if(op) update(,n,a,b,);
  78. else printf("%d\n",query(,n,a,b,));
  79. }
  80. }
  81. return ;
  82. }

HDU 3911 Black And White的更多相关文章

  1. hdu 3911 Black And White(线段树)

    题目连接:hdu 3911 Black And White 题目大意:给定一个序列,然后有M次操作: 0 l r:表示询问l,r中最大连续1的个数 1 l r:表示将l,r区间上的数取反 解题思路:线 ...

  2. HDU 3911 Black and White (线段树,区间翻转)

      [题目地址] vjudge HDU [题目大意] 海滩上有一堆石头. 石头的颜色是白色或黑色. 小肥羊拥有魔术刷,她可以改变连续石的颜色,从黑变白,从白变黑. 小肥羊非常喜欢黑色,因此她想知道范围 ...

  3. HDU 3911 Black And White (线段树区间合并 + lazy标记)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3911 给你n个数0和1,m个操作: 0操作  输出l到r之间最长的连续1的个数 1操作  将l到r之间 ...

  4. HDU 3911 Black And White 分段树 题解

    Problem Description There are a bunch of stones on the beach; Stone color is white or black. Little ...

  5. hdu 3911 Black And White (线段树 区间合并)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3911 题意: 给你一段01序列,有两个操作: 1.区间异或,2.询问区间最长的连续的1得长度 思路: ...

  6. HDU 3911 Black And White(线段树区间合并+lazy操作)

    开始以为是水题,结果...... 给你一些只有两种颜色的石头,0为白色,1为黑色. 然后两个操作: 1 l r 将[ l , r ]内的颜色取反 0 l r 计算[ l , r ]内最长连续黑色石头的 ...

  7. HDU 3911 线段树区间合并、异或取反操作

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3911 线段树区间合并的题目,解释一下代码中声明数组的作用: m1是区间内连续1的最长长度,m0是区间内连续 ...

  8. HDU 5113 Black And White 回溯+剪枝

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5113 Black And White Time Limit: 2000/2000 MS (Java/ ...

  9. [HDU 5113] Black And White (dfs+剪枝)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5113 题目大意:给你N*M的棋盘,K种颜色,每种颜色有c[i]个(sigma(c[i]) = N*M) ...

随机推荐

  1. PHP第九课 正則表達式在PHP中的使用

    今天内容 1.正則表達式 2.数学函数 3.日期函数 4.错误处理 正則表達式: 1.模式修正符 2.五个经常使用函数 另外一个正則表達式的站点:http://www.jb51.net/tools/z ...

  2. 支持并发的httpclient(基于tcp连接池以及netty)

    闲来无事,将曾经自己写的一个库放出来吧. . 有的时候会有这样子的需求: (1)serverA通过HTTP协议来訪问serverB (2)serverA可能会并发的像B发送非常多HTTP请求 类似于上 ...

  3. 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记3 Xcode、Auto Layout及MVC

    继续上一话中的计算器Demo.上一话讲到类必须被初始化.类中的属性也必须被初始化,所以你不能仅仅声明而不给它一个处置,那么问题来了,我们从storyboard中拖拽的@IBOutlet为什么仅仅有声明 ...

  4. java9新特性-16-Deprecated的相关API

    1.官方Feature 211: Elide Deprecation Warnings on Import Statements 214: Remove GC Combinations Depreca ...

  5. PostgreSQL Replication之第六章 监控您的设置(4)

    6.4 处理监控工具 还有几个监控工具可以使您的日常生活更轻松. 其中最流行的监控工具是Nagios.它被广泛地使用,也支持各种软件组件. 要使用 Nagios 来监控您的 PostgreSQL 集群 ...

  6. 《剑指offer》二进制中1的个数

    一.题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 二.牛客网提供的框架 class Solution { public: int NumberOf1(int n) { } ...

  7. 空宏-标C中空宏的妙用

    空宏的作用: 1)编译指示: 2)方便阅读: 定义宏,并在预处理过程中将其替换为空字符串(即删除) 偶然的机会,看到了下面的C代码:ISC_PLATFORM_NORETURN_PRE static v ...

  8. 修复linux的grub2引导(单独/boot,lvm-root)

    root@ubuntu:/home/ubuntu# pwd /home/ubuntu root@ubuntu:/home/ubuntu# lsblk NAME                  MAJ ...

  9. conda常用命令,如何在conda环境中安装gym库?

    查看已安装的环境: conda info -e 或 conda env list 创建新环境gymlab: conda create -n gymlab python=3.5 激活环境gymlab: ...

  10. numpy中list array matrix比较

    用python中的numpy包的时候不小心踩了array和matrix的大坑,又引申一下比较list array matrix之间的异同.数据结构(Data Structures)基本上人如其名——它 ...