[bzoj4592] [Shoi2015]脑洞治疗仪
题面无法直视系列。
中规中矩的线段树题。
涉及的操作有:区间赋值为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]脑洞治疗仪的更多相关文章
- bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪
http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...
- [BZOJ4592][SHOI2015]脑洞治疗仪(线段树)
线段树基础操作题,唯一需要思考下的是将区间的前k个0覆盖为1. 线段树上二分,先递归到左子树覆盖,回溯时返回还剩多少个0未被覆盖,在根据这个信息递归到右子树.注意特判k=0的情况. 要维护的信息有:区 ...
- BZOJ4592 SHOI2015脑洞治疗仪(线段树)
考虑需要资瓷哪些操作:区间赋值为0:统计区间1的个数:将区间前k个0变为1:询问区间最长全0子串.于是线段树维护区间1的个数.0的个数.最长前缀后缀全0子串即可.稍微困难的是用一个log实现将区间前k ...
- 2019.01.19 bzoj4592: [Shoi2015]脑洞治疗仪(ODT)
传送门 ODT水题. 支持区间01赋值,区间填补(把区间[l,r][l,r][l,r]从左往右数kkk个1都变成0),区间查询最长连续1个数. 思路: 区间填补操作感觉不是很好弄,写线段树的神仙可以套 ...
- 【BZOJ4592】[Shoi2015]脑洞治疗仪 线段树
[BZOJ4592][Shoi2015]脑洞治疗仪 Description 曾经发明了自动刷题机的发明家SHTSC又公开了他的新发明:脑洞治疗仪--一种可以治疗他因为发明而日益增大的脑洞的神秘装置. ...
- 【BZOJ-4592】脑洞治疗仪 线段树
4592: [Shoi2015]脑洞治疗仪 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 69 Solved: 38[Submit][Status] ...
- 【题解】Luogu P4344 [SHOI2015]脑洞治疗仪
原题传送门:P4344 [SHOI2015]脑洞治疗仪 前置芝士:珂朵莉树 窝博客里对珂朵莉树的介绍 没什么好说的自己看看吧 珂朵莉树好题啊 我一开始一直Re65 后来重构代码就ac了,或许是rp问题 ...
- [SHOI2015]脑洞治疗仪(恶心的线段树,区间最大子段和)
题目描述: 曾经发明了自动刷题机的发明家 SHTSC 又公开了他的新发明:脑洞治疗仪--一种可以治疗他因为发明而日益增大的脑洞的神秘装置. 为了简单起见,我们将大脑视作一个 01 序列.11代表这个位 ...
- 【bzoj4592】[Shoi2015]脑洞治疗仪
由于脑洞的序列不会改变,考虑用线段树维护区间内sum,左边0的个数,右边0的个数,区间内最大脑洞.对于查询l~r最大脑洞可以将l~r分成logn个区间,总复杂度O(nlogn). #include&l ...
随机推荐
- iOS Label 自适应高度
推荐第二个 测试一,只改变numberOfLines属性,label的高度不会自适应(会有text中的一部分内容称为......) NSString *str = @"jgreijgirje ...
- bzoj 4237: 稻草人
Description JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要 ...
- (一)DOM 常用操作 —— “查找”节点
在 DOM 树中,如果想要操作一个节点,那么首先要"查找"到这个节点.查找节点的方法由 Document 接口定义,而该接口由 JavaScript 中的 document 对象实 ...
- C语言中static关键字的用法
C记得还是大一时学的,现在觉得好久没用了,又捧起来看看.今天刚看到有关static关键字,仔细地看了一遍<C和指针>这本书中的解释,现在觉得清楚多了. 首先,我们将static关键字,修饰 ...
- 深入理解 Python 异步编程(上)
http://python.jobbole.com/88291/ 前言 很多朋友对异步编程都处于"听说很强大"的认知状态.鲜有在生产项目中使用它.而使用它的同学,则大多数都停留在知 ...
- Git操作流程,基本命令演示
任务列表: 有一个中央库Center,和三个工作站A,B,C. 初始化时,代码存放在中央库中,A,B,C三个工作站开始工作之前都要首先从中央库克隆一份代码到本地. 第一个任务:A和B合作修复一个缺陷, ...
- mysql 数据表字段修改sql 语句
1 新增字段 alter table bulletin add citycode varchar(6) not null default 0 [after `id`]; # 城市代码 2 修改字段 a ...
- leetcode — reorder-list
/** * Source : https://oj.leetcode.com/problems/reorder-list/ * * Given a singly linked list L: L0→L ...
- Layout 不可思议(二)—— 两侧定宽的三列布局
三列布局作为网页设计中最常见的布局,其实现方法早已被诸位前端大神摸透 网上相关的文章很多,原本已无必要再做赘述 不过既然开了 Layout 系列,三列布局就是必修课 本文整理了一些常用的实现方法,然后 ...
- Java贪吃蛇感想
暑假敲代码的效率真的不高呀,一个这种小游戏从最开始构思到最后实施代码,从最开始的Demo版本到最后的第四版本,花了一个星期了.本想再更新一个版本,加入双人对战模式,还想写个AI版,可是我估计按照现在我 ...