题面无法直视系列。

  中规中矩的线段树题。

  涉及的操作有:区间赋值为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. C语言中一些不被熟知的特性

    designated initializers(c99) C99允许你对结构体中指定的变量初始化,如 struct Foo { int x; int y; int z; }; }; 指定初始化也可适用 ...

  2. Spring拦截器总结

    本文是对慕课网上"搞定SSM开发"路径的系列课程的总结,详细的项目文档和课程总结放在github上了.点击查看 Spring过滤器WebFilter可以配置中文过滤 拦截器实现步骤 ...

  3. scala-Future和Promise

    首先说明同步与异步,阻塞与非阻塞的问题: Asynchronous vs. Synchronous A method call is considered synchronous if the cal ...

  4. 基于阿里云的MQTT远程控制

    好久没有写博客了,眼看自己的项目就要快做完了,先分享一下基于MQTT的远程控制,自己买了一个阿里的云端,然后在云端上安装了一个MQTT服务器,其实是一不小心买了两个,所以准备贡献出来一个供大家使用, ...

  5. Windows,Mac与Linux哪个更适合开发者?

        以前写的,怕引来口水战,干脆不发.这段时间面试了十来人,用Mac的开发水平明显高于Windows的,挺多感想的,于是改改发了吧.      Windows: 对普通用户而言体验最友好,对开发者 ...

  6. Qt编写QUI皮肤生成器

    用Qt写项目写多了,为了满足不同客户的需求,需要定制不同样式的界面,QUI皮肤生成器应运而生.思考这个工具的架构花了一年时间,如何从复杂的配色方案中提取出共性,然后将共性转为具体的QSS文件.思考架构 ...

  7. selenium 封装

    周末无聊 在家封装一个pyselenium.可能这些封装大家都会使用,但是我还是根据我自己的习惯去选择性的去封装一些在我工作中用的,这样的话,我就不用去看selenium的api的,我可以根据我自己的 ...

  8. SQL Server 2016 行级别权限控制

    背景 假如我们有关键数据存储在一个表里面,比如人员表中包含员工.部门和薪水信息.只允许用户访问各自部门的信息,但是不能访问其他部门.一般我们都是在程序端实现这个功能,而在sqlserver2016以后 ...

  9. R语言命令行参数

        批量画图任务中,需要在R中传入若干参数,之前对做法是在perl中每一个任务建立一个Rscript,这种方式超级不cool,在群里学习到R的@ARGV调用方式,差不多能够达到批量任务的要求: a ...

  10. JavaWeb一小时急速入门总结反思

    0.条件一个可以开发javaee的开发工具1.配置首先需要下载tomcat,用来跑javaweb的服务器,下载后自行百度配置.然后需要servlet.jar包,其实就是一个java网络层api包2.基 ...