【BZOJ-4592】脑洞治疗仪 线段树
4592: [Shoi2015]脑洞治疗仪
Time Limit: 20 Sec Memory Limit: 256 MB
Submit: 69 Solved: 38
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
0 2 2
0 4 6
0 10 10
2 1 10
1 8 10 1 4
2 1 10
1 1 4 8 10
2 1 10
1 7 10 1 6
2 1 10
Sample Output
3
6
6
HINT
Source
Solution
线段树维护区间连续的东西....
维护一下左右端点合并的时候注意一下就可以,对于填脑洞操作,进行二分,即可
Code
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
inline int read()
{
int x=,f=; char ch=getchar();
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x*f;
}
#define maxn 210000
int n,m;
struct TreeNode{int l,r,size,len,lx,rx,tag,ans;}tree[maxn<<];
TreeNode Merge(TreeNode x,TreeNode y)
{
TreeNode re;
re.l=x.l,re.r=y.r,re.len=x.len+y.len,re.size=re.r-re.l+;
if (x.len==x.size) re.lx=x.len+y.lx; else re.lx=x.lx;
if (y.len==y.size) re.rx=y.len+x.rx; else re.rx=y.rx;
re.ans=max(max(x.ans,y.ans),x.rx+y.lx); re.tag=-;
return re;
}
inline void UpDate(int now) {tree[now]=Merge(tree[now<<],tree[now<<|]);}
void BuildTree(int now,int l,int r)
{
tree[now].l=l,tree[now].r=r,tree[now].size=r-l+,tree[now].tag=-;
tree[now].lx=tree[now].rx=tree[now].ans=tree[now].len=;
if (l==r) return;
int mid=(l+r)>>;
BuildTree(now<<,l,mid); BuildTree(now<<|,mid+,r);
// UpDate(now);
}
inline void Paint(int now,int c)
{
if (c==) tree[now].lx=tree[now].rx=tree[now].ans=tree[now].len=;
else tree[now].lx=tree[now].rx=tree[now].ans=tree[now].len=tree[now].size;
tree[now].tag=c;
}
inline void PushDown(int now)
{
if (tree[now].tag==-) return;
Paint(now<<,tree[now].tag); Paint(now<<|,tree[now].tag);
tree[now].tag=-;
}
void DisposalHole(int now,int L,int R,int deal)
{
if (L<=tree[now].l && R>=tree[now].r) {Paint(now,deal); return;}
PushDown(now);
int mid=(tree[now].l+tree[now].r)>>;
if (L<=mid) DisposalHole(now<<,L,R,deal);
if (R>mid) DisposalHole(now<<|,L,R,deal);
UpDate(now);
}
int Length(int now,int L,int R)
{
if (L<=tree[now].l && R>=tree[now].r) return tree[now].len;
PushDown(now);
int mid=(tree[now].l+tree[now].r)>>,re=;
if (L<=mid) re+=Length(now<<,L,R);
if (R>mid) re+=Length(now<<|,L,R);
return re;
}
void FillHole(int now,int L,int R,int cnt)
{
if (cnt==) return;
if (L<=tree[now].l && R>=tree[now].r && tree[now].len<=cnt) {Paint(now,); return;}
PushDown(now);
int mid=(tree[now].l+tree[now].r)>>,len;
if (L<=mid)
if ((len=Length(now<<,L,R))<cnt)
{DisposalHole(now<<,L,R,); if (R>mid) FillHole(now<<|,L,R,cnt-len);}
else FillHole(now<<,L,R,cnt);
else FillHole(now<<|,L,R,cnt);
UpDate(now);
}
TreeNode Query(int now,int L,int R)
{ if (L<=tree[now].l && R>=tree[now].r) return tree[now];
PushDown(now);
int mid=(tree[now].l+tree[now].r)>>;
if (R<=mid) return Query(now<<,L,R);
else if (L>mid) return Query(now<<|,L,R);
else return Merge(Query(now<<,L,R),Query(now<<|,L,R));
}
int main()
{
n=read(); m=read();
BuildTree(,,n);
for (int i=; i<=m; i++)
{
int opt=read(); int l,r,L,R,cnt=;
switch (opt)
{
case : L=read(),R=read(); DisposalHole(,L,R,); break;
case : l=read(),r=read(),L=read(),R=read(),cnt=r-l+-Length(,l,r); DisposalHole(,l,r,); FillHole(,L,R,cnt); break;
case : L=read(),R=read(); printf("%d\n",Query(,L,R).ans); break;
}
}
return ;
}
小号非权限跑的飞快,直冲rank3
大号权限被小号卡rank4,怒加inline,跑的更慢了...
【BZOJ-4592】脑洞治疗仪 线段树的更多相关文章
- BZOJ 4592 SHOI2015 脑洞治疗仪 线段树
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4592 题意概述:需要维护一个01序列A,一开始A全部都是1.支持如下操作: 1.将区间[l ...
- 【BZOJ4592】[Shoi2015]脑洞治疗仪 线段树
[BZOJ4592][Shoi2015]脑洞治疗仪 Description 曾经发明了自动刷题机的发明家SHTSC又公开了他的新发明:脑洞治疗仪--一种可以治疗他因为发明而日益增大的脑洞的神秘装置. ...
- [BZOJ4592][SHOI2015]脑洞治疗仪(线段树)
线段树基础操作题,唯一需要思考下的是将区间的前k个0覆盖为1. 线段树上二分,先递归到左子树覆盖,回溯时返回还剩多少个0未被覆盖,在根据这个信息递归到右子树.注意特判k=0的情况. 要维护的信息有:区 ...
- Bzoj 2752 高速公路 (期望,线段树)
Bzoj 2752 高速公路 (期望,线段树) 题目链接 这道题显然求边,因为题目是一条链,所以直接采用把边编上号.看成序列即可 \(1\)与\(2\)号点的边连得是. 编号为\(1\)的点.查询的时 ...
- bzoj 4592(洛谷 4344) [Shoi2015]脑洞治疗仪——线段树上二分
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4592 1操作就是用线段树来二分找到第一个有 k 个0的位置. 在洛谷上A了,与暴力和网上题解 ...
- BZOJ.3938.Robot(李超线段树)
BZOJ UOJ 以时间\(t\)为横坐标,位置\(p\)为纵坐标建坐标系,那每个机器人就是一条\(0\sim INF\)的折线. 用李超线段树维护最大最小值.对于折线分成若干条线段依次插入即可. 最 ...
- BZOJ.1558.[JSOI2009]等差数列(线段树 差分)
BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...
- BZOJ 3779: 重组病毒(线段树+lct+树剖)
题面 escription 黑客们通过对已有的病毒反编译,将许多不同的病毒重组,并重新编译出了新型的重组病毒.这种病毒的繁殖和变异能力极强.为了阻止这种病毒传播,某安全机构策划了一次实验,来研究这种病 ...
- BZOJ 3123 森林(函数式线段树)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3123 题意: 思路:总的来说,查询区间第K小利用函数式线段树的减法操作.对于两棵树的合并 ...
随机推荐
- I/O 流和对象序列化
一.I/O 流(java 如何实现与外界数据的交流) 流定义: 任何有能力产出数据的数据源对象或者有能力接收数据的数据源对象.他屏蔽了实际的I/O设备处理数据的细节. 1.Input/Output:指 ...
- python 图
class Graph(object): def __init__(self,*args,**kwargs): self.node_neighbors = {} self.visited = {} d ...
- Qt学习笔记常用容器
主要说Qt的以下几种容器 1.QList<T> 2.QLinkedList<T> 3.Map<T> 和一些常用的容器方法的使用 qSort qCopy qFind ...
- windows 下 redis for php 配置
下载 redis,下载地址 https://github.com/dmajkic/redis/downloads,下载下来 zip 文件,解压,根据系统选择解压的文件夹(比如我的是 64bit). 我 ...
- 3到6年的.NETer应该掌握哪些知识?
我们组的开发人力一直比较紧张,今年春节后,高层终于给了几个headcount,我们可以开始招人了.从三月初我们就开始找简历,渠道有拉钩,内推,我司自己的招聘网站和智联等.简历筛了很多,也打了很多电话, ...
- 深入理解OOP(二):多态和继承(继承)
本文是深入浅出OOP第二篇,主要说说继承的话题. 深入理解OOP(一):多态和继承(初期绑定和编译时多态) 深入理解OOP(二):多态和继承(继承) 深入理解OOP(三):多态和继承(动态绑定和运行时 ...
- 使用Python 将shapefile导入mongodb
使用Python 将shapefile导入mongodb 随着big data时代的到来,各个行业都在考虑能不能把big data的思路.方法引入进来,GIS行业也不能免俗. 下面就介绍一下如何将sh ...
- nios II--实验2——led软件部分
软件开发 首先,在硬件工程文件夹里面新建一个software的文件夹用于放置软件部分:打开toolsàNios II 11.0 Software Build Tools for Eclipse,需要进 ...
- Altera SoC与Matlab的联合---第一步 软件安装与硬件测试
参考设计:http://cn.mathworks.com/help/hdlcoder/examples/getting-started-with-hardware-software-codesign- ...
- Matlab学习笔记 figure函数
Matlab学习笔记 figure函数 matlab中的 figure 命令,能够创建一个用来显示图形输出的一个窗口对象.每一个这样的窗口都有一些属性,例如窗口的尺寸.位置,等等.下面一一介绍它们. ...