[BZOJ4592][SHOI2015]脑洞治疗仪(线段树)
线段树基础操作题,唯一需要思考下的是将区间的前k个0覆盖为1。
线段树上二分,先递归到左子树覆盖,回溯时返回还剩多少个0未被覆盖,在根据这个信息递归到右子树。注意特判k=0的情况。
要维护的信息有:区间左边最长0连续段,右边最长0连续段,区间整体最长0连续段,区间内1的个数,以及一个记录是否被区间覆盖的懒惰标记。
#include<cstdio>
#include<algorithm>
#define ls (x<<1)
#define rs (ls|1)
#define lson ls,L,mid
#define rson rs,mid+1,R
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
using namespace std; const int N=;
int n,m,op,l,r,l1,r1,l2,r2,mx[N<<],mxl[N<<],mxr[N<<],cnt[N<<],tag[N<<]; void build(int x,int L,int R){
int mid=(L+R)>>;
tag[x]=-; cnt[x]=R-L+;
if (L==R) return;
build(lson); build(rson);
} void upd(int x,int L,int R){
int mid=(L+R)>>;
mxl[x]=mxl[ls]+(mxl[ls]==mid-L+ ? mxl[rs] : );
mxr[x]=mxr[rs]+(mxr[rs]==R-mid ? mxr[ls] : );
mx[x]=max(max(mx[ls],mx[rs]),mxr[ls]+mxl[rs]);
cnt[x]=cnt[ls]+cnt[rs];
} void put(int x,int L,int R,int k){
if (!k) mxl[x]=mxr[x]=mx[x]=R-L+,cnt[x]=,tag[x]=k;
else mxl[x]=mxr[x]=mx[x]=,cnt[x]=R-L+,tag[x]=k;
} void push(int x,int L,int R){
int mid=(L+R)>>;
if (~tag[x]) put(ls,L,mid,tag[x]),put(rs,mid+,R,tag[x]),tag[x]=-;
} void mdf(int x,int L,int R,int l,int r,int k){
if (L==l && r==R){ put(x,L,R,k); return; }
int mid=(L+R)>>; push(x,L,R);
if (r<=mid) mdf(lson,l,r,k);
else if (l>mid) mdf(rson,l,r,k);
else mdf(lson,l,mid,k),mdf(rson,mid+,r,k);
upd(x,L,R);
} int que(int x,int L,int R,int l,int r){
if (L==l && r==R) return cnt[x];
int mid=(L+R)>>; push(x,L,R);
if (r<=mid) return que(lson,l,r);
else if (l>mid) return que(rson,l,r);
else return que(lson,l,mid)+que(rson,mid+,r);
} int paint(int x,int L,int R,int l,int r,int k){
if (!k) return ;
if (L==l && r==R && R-L+-cnt[x]<=k){ k-=R-L+-cnt[x]; put(x,L,R,); return k; }
int mid=(L+R)>>; push(x,L,R);
if (r<=mid) k=paint(lson,l,r,k);
else if (l>mid) k=paint(rson,l,r,k);
else{
int t=paint(lson,l,mid,k);
if (t) k=paint(rson,mid+,r,t); else k=;
}
upd(x,L,R); return k;
} int get(int x,int L,int R,int l,int r){
if (L==l && r==R) return mx[x];
int mid=(L+R)>>; push(x,L,R);
if (r<=mid) return get(lson,l,r);
else if (l>mid) return get(rson,l,r);
else return max(max(get(lson,l,mid),get(rson,mid+,r)),min(mxr[ls],mid-l+)+min(mxl[rs],r-mid));
} int main(){
freopen("bzoj4592.in","r",stdin);
freopen("bzoj4592.out","w",stdout);
scanf("%d%d",&n,&m); build(,,n);
rep(i,,m){
scanf("%d",&op);
if (op==) scanf("%d%d",&l,&r),mdf(,,n,l,r,);
if (op==){
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
int t=que(,,n,l1,r1); mdf(,,n,l1,r1,);
paint(,,n,l2,r2,t);
}
if (op==) scanf("%d%d",&l,&r),printf("%d\n",get(,,n,l,r));
//rep(i,1,n) printf("%d ",que(1,1,n,i,i)); puts("");
}
return ;
}
[BZOJ4592][SHOI2015]脑洞治疗仪(线段树)的更多相关文章
- 【BZOJ4592】[Shoi2015]脑洞治疗仪 线段树
[BZOJ4592][Shoi2015]脑洞治疗仪 Description 曾经发明了自动刷题机的发明家SHTSC又公开了他的新发明:脑洞治疗仪--一种可以治疗他因为发明而日益增大的脑洞的神秘装置. ...
- 【BZOJ-4592】脑洞治疗仪 线段树
4592: [Shoi2015]脑洞治疗仪 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 69 Solved: 38[Submit][Status] ...
- BZOJ 4592 SHOI2015 脑洞治疗仪 线段树
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4592 题意概述:需要维护一个01序列A,一开始A全部都是1.支持如下操作: 1.将区间[l ...
- BZOJ4592 SHOI2015脑洞治疗仪(线段树)
考虑需要资瓷哪些操作:区间赋值为0:统计区间1的个数:将区间前k个0变为1:询问区间最长全0子串.于是线段树维护区间1的个数.0的个数.最长前缀后缀全0子串即可.稍微困难的是用一个log实现将区间前k ...
- [bzoj4592] [Shoi2015]脑洞治疗仪
题面无法直视系列. 中规中矩的线段树题. 涉及的操作有:区间赋值为0,计算区间内1的个数,区间赋值为1,求区间内最大的连续的1的个数. #include<cstdio> #include& ...
- 2019.01.19 bzoj4592: [Shoi2015]脑洞治疗仪(ODT)
传送门 ODT水题. 支持区间01赋值,区间填补(把区间[l,r][l,r][l,r]从左往右数kkk个1都变成0),区间查询最长连续1个数. 思路: 区间填补操作感觉不是很好弄,写线段树的神仙可以套 ...
- bzoj 4592(洛谷 4344) [Shoi2015]脑洞治疗仪——线段树上二分
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4592 1操作就是用线段树来二分找到第一个有 k 个0的位置. 在洛谷上A了,与暴力和网上题解 ...
- bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪
http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...
- 【题解】Luogu P4344 [SHOI2015]脑洞治疗仪
原题传送门:P4344 [SHOI2015]脑洞治疗仪 前置芝士:珂朵莉树 窝博客里对珂朵莉树的介绍 没什么好说的自己看看吧 珂朵莉树好题啊 我一开始一直Re65 后来重构代码就ac了,或许是rp问题 ...
随机推荐
- [Openwrt 扩展下篇] Openwrt搭建私有云Owncloud 9
网上很多资料讲用Linux打造owncloud构建私有云 ,花了些时间研究了下,我将之前的需求打造成了Openwrt下的Owncloud 9.其实网上还有Seafile.大家对比来看下知乎的评论,其实 ...
- 凸包入门(Graham扫描法)(A - Wall POJ - 1113)
题目链接:https://cn.vjudge.net/contest/276359#problem/A 题目大意:有一个国王,要在自己的城堡周围建立围墙,要求围墙能把城堡全部围起来,并且围墙距离城堡的 ...
- 20165329 Java实验二:面向对象编程
实验内容: 面向对象程序设计-1 实验要求: 提交最后三个JUnit测试用例(正常情况,错误情况,边界情况)都通过的截图 实验步骤: 1.按照老师博客的要求新建一个MyUtil项目 在src内新建ja ...
- 2016.5.18——Excel Sheet Column Number
Excel Sheet Column Number 本题收获: 1.对于字符串中字母转为ASIIC码:string s ;res = s[i]-'A'; 这个res就是数字s[i]-'A'是对ASII ...
- Spring笔记13--SSH--全注解开发
SSH全注解开发: (1) 在Action类中添加注解,实现Struts2的注解开发(@NameSpace.@ParentPackage.@Action...) package com.tongji. ...
- 被我误解的max_connect_errors【转】
实为吾之愚见,望诸君酌之!闻过则喜,与君共勉 第一节 什么是max_connect_errors 一开始接触这个参数的时候,感觉他和max_connections的含义差不多,字面意思简单明了,这个 ...
- [NOI2014]购票 「树上斜率优化」
首先易得方程,且经过变换有 $$\begin{aligned} f_i &= \min\limits_{dist_i - lim_i \le dist_j} \{f_j + (dist_i - ...
- mysql命令补全工具
需要在linux中下载mysql插件. 安装mysql插件 yum -y install epel-release python-pip python-devel pip install mycli ...
- 微软Holographic将更名为Windows Mixed Reality
微软Holographic将更名为Windows Mixed Reality ----世界变化好快. 还没来得及细细品味,它就已经更名了. 程序员的焦虑,处在一个信息大爆炸的年代,大数据,云计算,机 ...
- js实现ctrl+v粘贴图片或是截图
浏览器环境:谷歌浏览器 1.ctrl+v粘贴图片都是监听paste时间实现的,复制的数据都存在clipboardData下面,虽然打印显示数据长度为0,但是还是可以获取数据的 2.打印clipboar ...