4592: [Shoi2015]脑洞治疗仪

Time Limit: 20 Sec  Memory Limit: 256 MB
Submit: 69  Solved: 38
[Submit][Status][Discuss]

Description

曾经发明了自动刷题机的发明家SHTSC又公开了他的新发明:脑洞治疗仪--一种可以治疗他因为发明而日益增大的脑洞的神秘装置。
为了简单起见,我们将大脑视作一个01序列。1代表这个位置的脑组织正常工作,0代表这是一块脑洞。
1 0 1 0 0 0 1 1 1 0
脑洞治疗仪修补某一块脑洞的基本工作原理就是将另一块连续区域挖出,将其中正常工作的脑组织填补在这块脑洞中。
(所以脑洞治疗仪是脑洞的治疗仪?)
例如,用上面第8号位置到第10号位置去修补第1号位置到第4号位置的脑洞。我们就会得到:
1 1 1 1 0 0 1 0 0 0
如果再用第1号位置到第4号位置去修补第8号位置到第10号位置:
0 0 0 0 0 0 1 1 1 1
这是因为脑洞治疗仪会把多余出来的脑组织直接扔掉。
如果再用第7号位置到第10号位置去填补第1号位置到第6号位置:
1 1 1 1 0 0 0 0 0 0
这是因为如果新脑洞挖出来的脑组织不够多,脑洞治疗仪仅会尽量填补位置比较靠前的脑洞。
假定初始时SHTSC并没有脑洞,给出一些挖脑洞和脑洞治疗的操作序列,你需要即时回答SHTSC的问题:
在大脑某个区间中最大的连续脑洞区域有多大。

Input

第一行两个整数n,m。表示SHTSC的大脑可分为从1到n编号的n个连续区域。有m个操作。
以下m行每行是下列三种格式之一。
0 l r :SHTSC挖了一个从l到r的脑洞。
1 l0 r0 l1 r2 :SHTSC进行了一次脑洞治疗,用从l0到r0的脑组织修补l1到r1的脑洞。
2 l r :SHTSC询问l到r这段区间最大的脑洞有多大。
n,m <=200000,1<=l<=r<=n

Output

对于每个询问,输出一行一个整数,表示询问区间内最大连续脑洞区域有多大。

Sample Input

10 10
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
3
6
6

HINT

Source

By 佚名上传

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】脑洞治疗仪 线段树的更多相关文章

  1. BZOJ 4592 SHOI2015 脑洞治疗仪 线段树

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4592 题意概述:需要维护一个01序列A,一开始A全部都是1.支持如下操作: 1.将区间[l ...

  2. 【BZOJ4592】[Shoi2015]脑洞治疗仪 线段树

    [BZOJ4592][Shoi2015]脑洞治疗仪 Description 曾经发明了自动刷题机的发明家SHTSC又公开了他的新发明:脑洞治疗仪--一种可以治疗他因为发明而日益增大的脑洞的神秘装置. ...

  3. [BZOJ4592][SHOI2015]脑洞治疗仪(线段树)

    线段树基础操作题,唯一需要思考下的是将区间的前k个0覆盖为1. 线段树上二分,先递归到左子树覆盖,回溯时返回还剩多少个0未被覆盖,在根据这个信息递归到右子树.注意特判k=0的情况. 要维护的信息有:区 ...

  4. Bzoj 2752 高速公路 (期望,线段树)

    Bzoj 2752 高速公路 (期望,线段树) 题目链接 这道题显然求边,因为题目是一条链,所以直接采用把边编上号.看成序列即可 \(1\)与\(2\)号点的边连得是. 编号为\(1\)的点.查询的时 ...

  5. bzoj 4592(洛谷 4344) [Shoi2015]脑洞治疗仪——线段树上二分

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4592 1操作就是用线段树来二分找到第一个有 k 个0的位置. 在洛谷上A了,与暴力和网上题解 ...

  6. BZOJ.3938.Robot(李超线段树)

    BZOJ UOJ 以时间\(t\)为横坐标,位置\(p\)为纵坐标建坐标系,那每个机器人就是一条\(0\sim INF\)的折线. 用李超线段树维护最大最小值.对于折线分成若干条线段依次插入即可. 最 ...

  7. BZOJ.1558.[JSOI2009]等差数列(线段树 差分)

    BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...

  8. BZOJ 3779: 重组病毒(线段树+lct+树剖)

    题面 escription 黑客们通过对已有的病毒反编译,将许多不同的病毒重组,并重新编译出了新型的重组病毒.这种病毒的繁殖和变异能力极强.为了阻止这种病毒传播,某安全机构策划了一次实验,来研究这种病 ...

  9. BZOJ 3123 森林(函数式线段树)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3123 题意: 思路:总的来说,查询区间第K小利用函数式线段树的减法操作.对于两棵树的合并 ...

随机推荐

  1. Delphi连接Oracle控件ODAC的安装及使用(轉載)

     Delphi连接Oracle控件ODAC的安装及使用 2010-08-13 01:13:37 标签:Oracle Delphi 控件 休闲 ODAC 原创作品,允许转载,转载时请务必以超链接形式标明 ...

  2. Java设计模式之-----工厂模式(简单工厂,抽象工厂)

    一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factor ...

  3. C#开源系统大汇总

    一.AOP框架 Encase 是C#编写开发的为.NET平台提供的AOP框架.Encase 独特的提供了把方面(aspects)部署到运行时代码,而其它AOP框架依赖配置文件的方式.这种部署方面(as ...

  4. 李学斌:论复杂系统中的应用间协作V3

    说明 本文主要讨论了巨型复杂业务系统的一种构建思路,力图实现决策意志的快速.准确.一致的下传并简化实施成本提供实施效率.通过全业务领域的即时流程编排,实现全网业务IT系统的快速建设与迭代.本文所讲的方 ...

  5. lecture7-序列模型及递归神经网络RNN

    Hinton 第七课 .这里先说下RNN有recurrent neural network 和 recursive neural network两种,是不一样的,前者指的是一种人工神经网络,后者指的是 ...

  6. Theano2.1.14-基础知识之理解为了速度和正确性的内存别名

    来自:http://deeplearning.net/software/theano/tutorial/aliasing.html Understanding Memory Aliasing for ...

  7. 大学回顾和C与PHP之路

    我去年毕业,从事PHP学习和开发一年多. background:medical muti-media electric web; 先讲一下我的背景吧,我大学的学校是一个医科学校,然而专业是计算机动漫设 ...

  8. 学习Python的三种境界

    前言 王国维在<人间词话>中将读书分为了三种境界:"古今之成大事业.大学问者,必经过三种之境界:'昨夜西风凋碧树,独上高楼,望尽天涯路'.此第一境也.'衣带渐宽终不悔,为伊消得人 ...

  9. 彻底明白IP地址——IP地址的介绍

    彻底明白IP地址——IP地址的介绍 [ 作者:担子    转贴自:赛迪网    点击数:9692    更新时间:2004-12-22  ]   IP地址的介绍 1.IP地址的表示方法 IP地址 = ...

  10. Social Emotional Computing -情感模式与价值变化

    情感模式与价值变化 第七节 情感模式与价值变化 情感与价值的关系是主观与客观的关系,人的情感不管多么飘忽不定,都可以找到它的价值对应物,情感的任何变化都可以从价值关系的变动中找到它的客观动因,情感的不 ...