题面无法直视系列。

  中规中矩的线段树题。

  涉及的操作有:区间赋值为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. Java I/O---RandomAccessFile类(随机访问文件的读取和写入)

    1.JDK API中RandomAccessFile类的描述 此类的实例支持对随机访问文件的读取和写入.随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组.存在指向该隐含数组的光标或索引 ...

  2. LAMP第四部分mysql操作

    1. 忘记root密码编辑mysql主配置文件 my.cnf 在[mysqld]字段下添加参数  skip-grant  ,重启数据库服务,这样就可以进入数据库不用授权了 mysql -uroot , ...

  3. 与apk签名有关的那些概念与命令

    一.概念篇 1.消息摘要-Message Digest 消息摘要:在消息数据上,执行一个单向的hash函数,生成一个固定长度的hash值,这个Hash值就是消息摘要,也成为数字指纹. 消息摘要特点: ...

  4. [编织消息框架][网络IO模型]Netty Reactor

    严格来讲Netty Reactor是一种设计模式,一听模式两字就知道了吧,套路哈哈 Reactor中文译为“反应堆”. 看图netty处理流程 1.netty server 至少有两组reactor. ...

  5. shiro中 UnknownAccountException

    一 shiro的session.request和response与服务端容器自身的这三个对象的关系 在web.xml中配置了一个Filter,拦截/*,所有的uri.在拦截器中还会调用ShiroFil ...

  6. 使用C#开发数据库应用系统 习题

    错题积累 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:

  7. Python的变量和常量

    解释器执行Python的过程:   (python3,c:/test.py) 1:启动python解释器(内存中). 2:将c:/test.py内容从硬盘读到内存中(这一步和文本编辑器是一样的). 3 ...

  8. python每日学习2018/1/11

    A.4 Python 关键字和内置函数 Python包含一系列关键字和内置函数,给变量命名时,知道这些关键字和内置函数很重要. 编程中面临的一个挑战是给变量指定合适的名称,变量名可以是任何东西,只要它 ...

  9. 记录一次APP的转让流程

    由于业务需要,需要将开发的App从一个账号(A账号)转移到另一个账号(B账号),这里简单介绍一下转让流程.主要包括两大步骤: 转让方(A账号)提出转让申请 接收方(B账号)接受转让App 如果不想看这 ...

  10. Python进阶内容(三)--- reduce

    描述 functools.reduce() 函数会对参数序列中元素进行累积.函数将一个数据集合(列表,元组等)中的所有数据进行下列操作:用传给reduce中的函数 function(有两个参数)先对集 ...