题面无法直视系列。

  中规中矩的线段树题。

  涉及的操作有:区间赋值为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. php-迭代创建级联目录

    方法一代码: path = './a/b/c/d/e/f'; $path_arr = explode('/',$path);//得到数组array('.','a','b','c','d','e','f ...

  2. MyBatis map foreach

    以下资料来源于网络,仅供参考学习.   mybatis 遍历map实例 map 数据如下 Map<String,List<Long>>.   测试代码如下: public vo ...

  3. Linux整合Apache和SVN

    1.安装APR-1.2.7和APR-util-1.2.7  (下载地址:http://apr.apache.org/) #tar zxvf  apr-1.2.7.tar.gz #cd   apr-1. ...

  4. Python 为何能坐稳 AI 时代头牌语言

    原文链接:https://mp.weixin.qq.com/s?__biz=MzI0ODcxODk5OA==&mid=2247487055&idx=2&sn=ca0fe8740 ...

  5. 记录Mac下安装pyenv时所遇到的问题

    http://blog.csdn.net/foryouslgme/article/details/51683654  

  6. android inline hook

    最近终于沉下心来对着书把hook跟注入方面的代码敲了一遍,打算写几个博客把它们记录下来. 第一次介绍一下我感觉难度最大的inline hook,实现代码参考了腾讯GAD的游戏安全入门. inline ...

  7. thinkinginjava学习笔记04_初始化与清理

    java沿用了c++的构造器,使用一个和类名完全一样的方法作为类的构造器,可以有多个构造器来通过不同的参数进行构造,称为重载:不仅是构造器可以重载,其他方法也一样通过不同的形参以及不同的返回值来实现重 ...

  8. mvc4.5更改为mvc4.0方法总结

    一:使用MVC4.5创建的项目结果IIS服务器不支持(windows server2008 支持.net4.0),整了半天终于有点眉目了,方法如下: 1.先将项目所在的文件夹找到,去掉文件夹及其文件的 ...

  9. cobbler自动安装系统(Centos7.X)

    环境: [root@kickstart ~]# cat /etc/redhat-release CentOS Linux release (Core) [root@kickstart ~]# unam ...

  10. eclipse环境下日志打印输出

    1.先将jdk配置一下 选Preferences---- 找到自己的jdk所在的位置 2.配置Tomcat window-----preferences------- 找到自己的tomcat所在位置 ...