题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3911

题意:

给你一段01序列,有两个操作:

1.区间异或,2.询问区间最长的连续的1得长度

思路:

线段树区间合并,开六个数组分别表示:

lsum0   区间左边界开始从左到右连续0的个数

rsum0   区间右边界开始从右到左连续0的个数

lsum1  rsum1 根据上面的可以看出

sum0  区间最长的连续0的个数

sum1 区间最长的连续1的个数

碰到i区间异或操作,我们直接奖这几个数组换下就好了

实现代码:

#include<bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define mid int m = (l + r) >> 1
#define ll long long
#define ull unsigned long long const int M = 1e5 + ;
int lsum1[M<<],rsum1[M<<],sum1[M<<],lsum0[M<<],rsum0[M<<],sum0[M<<],lazy[M<<];
int a[M];
void pushup(int l,int r,int rt){
mid;
lsum1[rt] = lsum1[rt<<]; lsum0[rt] = lsum0[rt<<];
rsum1[rt] = rsum1[rt<<|]; rsum0[rt] = rsum0[rt<<|];
if(lsum1[rt] == m-l+) lsum1[rt] += lsum1[rt<<|];
if(rsum1[rt] == r-m) rsum1[rt] += rsum1[rt<<];
if(lsum0[rt] == m-l+) lsum0[rt] += lsum0[rt<<|];
if(rsum0[rt] == r-m) rsum0[rt] += rsum0[rt<<];
sum0[rt] = max(max(sum0[rt<<],sum0[rt<<|]),rsum0[rt<<]+lsum0[rt<<|]);
sum1[rt] = max(max(sum1[rt<<],sum1[rt<<|]),rsum1[rt<<]+lsum1[rt<<|]);
} void swa(int rt){
swap(lsum0[rt],lsum1[rt]);
swap(rsum0[rt],rsum1[rt]);
swap(sum0[rt],sum1[rt]);
} void pushdown(int l,int r,int rt){
if(lazy[rt]){
lazy[rt<<] ^= lazy[rt];
lazy[rt<<|] ^= lazy[rt];
swa(rt<<); swa(rt<<|);
lazy[rt] = ;
}
} void build(int l,int r,int rt){
lazy[rt] = ;
lsum1[rt] = rsum1[rt] = sum1[rt] = ;
lsum0[rt] = rsum0[rt] = sum0[rt] = ;
if(l == r){
if(a[l]){
lsum1[rt] = rsum1[rt] = sum1[rt] = ;
lsum0[rt] = rsum0[rt] = sum0[rt] = ;
}
else{
lsum1[rt] = rsum1[rt] = sum1[rt] = ;
lsum0[rt] = rsum0[rt] = sum0[rt] = ;
}
return ;
}
mid;
build(lson); build(rson);
pushup(l,r,rt);
} void update(int L,int R,int l,int r,int rt){
if(L <= l&&R >= r){
lazy[rt] ^= ;
swa(rt);
return ;
}
pushdown(l,r,rt);
mid;
if(L <= m) update(L,R,lson);
if(R > m) update(L,R,rson);
pushup(l,r,rt);
} int query(int L,int R,int l,int r,int rt){
if(L <= l&&R >= r){
return sum1[rt];
}
pushdown(l,r,rt);
mid;
if(L > m) return query(L,R,rson);
if(R <= m) return query(L,R,lson);
int t1 = query(L,R,lson);
int t2 = query(L,R,rson);
int rs = min(lsum1[rt<<|],R-m);
int ls = min(m-L+,rsum1[rt<<]);
return max(max(t1,t2),ls+rs);
} int main()
{
int n,op,x,y,q;
while(scanf("%d",&n)!=EOF){
for(int i = ;i <= n;i ++){
scanf("%d",&a[i]);
}
build(,n,);
scanf("%d",&q);
while(q--){
scanf("%d%d%d",&op,&x,&y);
if(op == ) update(x,y,,n,);
else printf("%d\n",query(x,y,,n,));
}
}
return ;
}

hdu 3911 Black And White (线段树 区间合并)的更多相关文章

  1. 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之间 ...

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

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

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

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

  4. HDU 1540 Tunnel Warfare(线段树+区间合并)

    http://acm.hdu.edu.cn/showproblem.php?pid=1540 题目大意:抗日战争期间进行地道战,存在n个村庄用地道连接,输入D表示破坏某个村庄(摧毁与其相连的地道, 包 ...

  5. HDU - 1540 Tunnel Warfare(线段树区间合并)

    https://cn.vjudge.net/problem/HDU-1540 题意 D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少. 分析 线段树的区间内,我 ...

  6. HDU 4553 约会安排(线段树区间合并+双重标记)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4553 题目大意:就是有三种操作: ①DS x,安排一段长度为x的空闲时间跟屌丝一起,输出这段时间的起点 ...

  7. hdu 1540 Tunnel Warfare (线段树 区间合并)

    Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  8. (简单) HDU 3397 Sequence operation,线段树+区间合并。

    Problem Description lxhgww got a sequence contains n characters which are all '0's or '1's. We have ...

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

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

随机推荐

  1. 新页面,简单的tree视图写法

    .xml文件 <?xml version="1.0"?><openerp> <data> <!--Tree view--> < ...

  2. Hive 创建表

    创建表的三种方式: 方式一:新建表结构 CREATE TABLE emp( empno int, ename string ) ROW FORMAT DELIMITED FIELDS TERMINAT ...

  3. CF487E Tourists 圆方树、树链剖分

    传送门 注意到我们需要求的是两点之间所有简单路径中最小值的最小值,那么对于一个点双联通分量来说,如果要经过它,则一定会经过这个点双联通分量里权值最小的点 注意:这里不能缩边双联通分量,样例\(2\)就 ...

  4. Intel Digital Innovation Industry Summit(2018.08.17)

    时间:2018.08.17地点:北京金隅喜来登大酒店

  5. SpringMVC之单/多文件上传

    1.准备jar包(图标所指必备包,其他按情况导入) 2.项目结构 3.SingleController.java(控制器代码单文件和多文件) package com.wt.uplaod; import ...

  6. [JSOI2016]无界单词[动态规划、kmp]

    题意 题目链接 分析 对于第一问,枚举最终串最小的相同前后缀来统计答案. 由于最小的相同前后缀也是无界单词,所以可以考虑先求解子问题. 定义状态 \(f(i)\) 表示长度为 \(i\) 的串中有多少 ...

  7. 历时25天,我的博客(www.ityouknow.com)终于又活了过来

    时间回到2016年的7月10号,那时候我刚刚开始正式在博客园写博客,博客园的交流氛围很好,但鉴于博客园古老的界面,同时计划创建一个自己独立的博客,毕竟自己的博客怎么折腾都行. 那时候正在研究 Spri ...

  8. Visual Studio2017 Remote Debugger

    前言 大家在使用vs打包后的文件部署到服务器后,有时候我们需要对线网的后台进行调试.但是它不像在VS中.这个时候我们该怎么调试呢? 微软想到了这一点,他们在 VS 中给我们提供了一个功能: Remot ...

  9. Ubuntu apt-get提示被锁住

    执行 apt-get 时提示资源被锁住 E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavai ...

  10. Linux下FastDFS分布式存储-总结及部署记录

    一.分布式文件系统介绍分布式文件系统:Distributed file system, DFS,又叫做网络文件系统:Network File System.一种允许文件通过网络在多台主机上分享的文件系 ...