题面无法直视系列。

  中规中矩的线段树题。

  涉及的操作有:区间赋值为0,计算区间内1的个数,区间赋值为1,求区间内最大的连续的1的个数。

 #include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=,mxnode=maxn<<;
int lc[mxnode],rc[mxnode],sz[mxnode],num0[mxnode],mxl0[mxnode],mxr0[mxnode],mx0[mxnode],tot;
int tag[mxnode];
int i,j,k,n,m,L,R,MXR,NUM,ans;
bool first; int ra;char rx;
inline int read(){
rx=getchar(),ra=;
while(rx<''||rx>'')rx=getchar();
while(rx>=''&&rx<='')ra*=,ra+=rx-,rx=getchar();return ra;
} inline int max(int a,int b){return a>b?a:b;}
inline void upd(int x,int l,int r){
num0[x]=num0[l]+num0[r],
mxl0[x]=mxl0[l],mxr0[x]=mxr0[r];
if(mxl0[l]==sz[l])mxl0[x]+=mxl0[r];
if(mxr0[r]==sz[r])mxr0[x]+=mxr0[l];
mx0[x]=max(max(mx0[l],mx0[r]),mxr0[l]+mxl0[r]);
}
inline void pushdown(int x){
if(tag[x]==-)return;
int l=lc[x],r=rc[x];
if(tag[x]==)
tag[l]=tag[r]=,
mx0[l]=mxl0[l]=mxr0[l]=num0[l]=sz[l],
mx0[r]=mxl0[r]=mxr0[r]=num0[r]=sz[r];
else
tag[l]=tag[r]=,
mx0[l]=mxl0[l]=mxr0[l]=num0[l]=,
mx0[r]=mxl0[r]=mxr0[r]=num0[r]=;
tag[x]=-;
}
void build(int a,int b){
int x=++tot;
sz[x]=b-a+,tag[x]=-;
if(a==b)return;
int mid=a+b>>;
lc[x]=tot+,build(a,mid),rc[x]=tot+,build(mid+,b);
}
void cover0(int x,int a,int b){
if(num0[x]==sz[x])return;
if(L<=a&&R>=b){
tag[x]=,
mx0[x]=mxl0[x]=mxr0[x]=num0[x]=sz[x];
return;
}
pushdown(x);
int mid=a+b>>;
if(L<=mid)cover0(lc[x],a,mid);
if(R>mid)cover0(rc[x],mid+,b);
upd(x,lc[x],rc[x]);
}
void get1(int x,int a,int b){
if(num0[x]==sz[x])return;
if(L<=a&&R>=b){
NUM+=sz[x]-num0[x],
tag[x]=,
mx0[x]=mxl0[x]=mxr0[x]=num0[x]=sz[x];
return;
}
pushdown(x);
int mid=a+b>>;
if(L<=mid)get1(lc[x],a,mid);
if(R>mid)get1(rc[x],mid+,b);
upd(x,lc[x],rc[x]);
}
void treat(int x,int a,int b){
if(!num0[x]||!NUM)return;
if(L<=a&&R>=b&&num0[x]<=NUM){
NUM-=num0[x],tag[x]=,
mx0[x]=mxl0[x]=mxr0[x]=num0[x]=;
return;
}
pushdown(x);
int mid=a+b>>;
if(L<=mid)treat(lc[x],a,mid);
if(R>mid)treat(rc[x],mid+,b);
upd(x,lc[x],rc[x]);
}
void query(int x,int a,int b){
if(L<=a&&R>=b){
if(first)ans=mx0[x],MXR=mxr0[x],first=;
else{
ans=max(ans,max(MXR+mxl0[x],mx0[x]));
if(num0[x]==sz[x])MXR+=sz[x];else MXR=mxr0[x];
}
return;
}
pushdown(x);
int mid=a+b>>;
if(L<=mid)query(lc[x],a,mid);
if(R>mid)query(rc[x],mid+,b);
}
int main(){
n=read(),m=read();
build(,n);int id,x,y,x1,y1;
while(m--){
id=read(),x=read(),y=read();
if(id==)L=x,R=y,cover0(,,n);//,printf(" num0:%d mxl0:%d mxr0:%d\n",num0[1],mxl0[1],mxr0[1]);
if(id==){
x1=read(),y1=read(),NUM=,L=x,R=y,get1(,,n);
L=x1,R=y1,treat(,,n);
}
if(id==)
L=x,R=y,first=,ans=,query(,,n),printf("%d\n",ans);
}
return ;
}

[bzoj4592] [Shoi2015]脑洞治疗仪的更多相关文章

  1. bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪

    http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...

  2. [BZOJ4592][SHOI2015]脑洞治疗仪(线段树)

    线段树基础操作题,唯一需要思考下的是将区间的前k个0覆盖为1. 线段树上二分,先递归到左子树覆盖,回溯时返回还剩多少个0未被覆盖,在根据这个信息递归到右子树.注意特判k=0的情况. 要维护的信息有:区 ...

  3. BZOJ4592 SHOI2015脑洞治疗仪(线段树)

    考虑需要资瓷哪些操作:区间赋值为0:统计区间1的个数:将区间前k个0变为1:询问区间最长全0子串.于是线段树维护区间1的个数.0的个数.最长前缀后缀全0子串即可.稍微困难的是用一个log实现将区间前k ...

  4. 2019.01.19 bzoj4592: [Shoi2015]脑洞治疗仪(ODT)

    传送门 ODT水题. 支持区间01赋值,区间填补(把区间[l,r][l,r][l,r]从左往右数kkk个1都变成0),区间查询最长连续1个数. 思路: 区间填补操作感觉不是很好弄,写线段树的神仙可以套 ...

  5. 【BZOJ4592】[Shoi2015]脑洞治疗仪 线段树

    [BZOJ4592][Shoi2015]脑洞治疗仪 Description 曾经发明了自动刷题机的发明家SHTSC又公开了他的新发明:脑洞治疗仪--一种可以治疗他因为发明而日益增大的脑洞的神秘装置. ...

  6. 【BZOJ-4592】脑洞治疗仪 线段树

    4592: [Shoi2015]脑洞治疗仪 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 69  Solved: 38[Submit][Status] ...

  7. 【题解】Luogu P4344 [SHOI2015]脑洞治疗仪

    原题传送门:P4344 [SHOI2015]脑洞治疗仪 前置芝士:珂朵莉树 窝博客里对珂朵莉树的介绍 没什么好说的自己看看吧 珂朵莉树好题啊 我一开始一直Re65 后来重构代码就ac了,或许是rp问题 ...

  8. [SHOI2015]脑洞治疗仪(恶心的线段树,区间最大子段和)

    题目描述: 曾经发明了自动刷题机的发明家 SHTSC 又公开了他的新发明:脑洞治疗仪--一种可以治疗他因为发明而日益增大的脑洞的神秘装置. 为了简单起见,我们将大脑视作一个 01 序列.11代表这个位 ...

  9. 【bzoj4592】[Shoi2015]脑洞治疗仪

    由于脑洞的序列不会改变,考虑用线段树维护区间内sum,左边0的个数,右边0的个数,区间内最大脑洞.对于查询l~r最大脑洞可以将l~r分成logn个区间,总复杂度O(nlogn). #include&l ...

随机推荐

  1. 字符串输入时的strlen()与\0

    在做串的数据结构时,被字符串printf %s输出时的结尾判断.strlen();长度.自定义StrCopy();字符串复制函数.StrAssign();字符串赋值函数卡了一下,固写此博巩固相关知识点 ...

  2. 转:Siri之父:语音交互或将主导未来十年发展

    http://zhinengjiaohu.juhangye.com/201709/weixin_5664458.html Siri之父Adam Cheyer认为,语音交互很可能是未来十年内计算技术的一 ...

  3. yum 命令详解

    一. yum          作用:                     yum 命令是在Fedora 和RedHat 以及SUSE 中基于rpm 的软件包管理器,它可以使系统管理人员交互和自动 ...

  4. 序列化之对象,字符串,byte数组,XML之间的转换(一)

    工作一年多了,越来越感到自己不能这样一直下去,在最好的青春里面却已经死了.被时间消磨了意志,被工作杀死了精神.我想,我只要活着,我就要去不断的要求自己,不断的去追求更高的山峰. 放眼四周,有趣的灵魂越 ...

  5. python3 python2 import 的区别

    https://stackoverflow.com/questions/12172791/changes-in-import-statement-python3

  6. sql sever模糊查询和聚合函数

    使用is null 的时候 要确保 查询的列 可以为空! null:  01.标识  空值  02.不是0,也不是空串""  03.只能出现在定义 允许为null的字段  04.只 ...

  7. Robot Framework学习笔记(八)------ride标签使用

    一.edit标签使用 1.导入库 点击 Edit 标签页右侧的"Library"按钮,来添加库.在添加库之前,首先库已经在 Python 下进行了安装.如,添加"Sele ...

  8. Nginx优化use参数epoll,kqueue,rtsig,eventport,poll

    转自:http://blog.sina.com.cn/s/blog_5eaf88f10100gkrq.html Nginx use参数分析对比 下图对比了poll select epoll和kqueu ...

  9. 实战经验分享之C#对象XML序列化

    .Net Framework提供了对应的System.Xml.Seriazliation.XmlSerializer负责把对象序列化到XML,和从XML中反序列化为对象.Serializer的使用比较 ...

  10. Python模块学习---Web

    import urlparse url = urlparse.urlparse("http://www.python.org/doc/FAQ.html") print url pr ...