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. CLR Table-Valued函数

    这几天来,努力学习了CLR的存储过程,创建与部署.从普通的存储过程,带参数,以及Output返回值等. Insus.NET今天学习一个例子,怎样实现CLR Table-Valued函数.在数据库中,我 ...

  2. Palindrome Linked List

    Given a singly linked list, determine if it is a palindrome. Follow up:Could you do it in O(n) time ...

  3. js 随笔

    setInterval:即使在方法中使用了stopInterval这个方法也要执行完才会停止自行重复执行,解决:使用return false来跳出方法. JS string和num:当一个是字符串数字 ...

  4. 帆软FineReport如何使用程序数据集

    大多数情况下,FineReport直接在设计器里使用“数据集查询”,直接写SQL就能满足报表要求,但对于一些复杂的报表,有时候SQL处理并不方便,这时可以把查询结果在应用层做一些预处理后,再传递给报表 ...

  5. Chrome扩展开发之二——Chrome扩展中脚本的运行机制和通信方式

    目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...

  6. ThreadLocal原理及其实际应用

    前言 java猿在面试中,经常会被问到1个问题: java实现同步有哪几种方式? 大家一般都会回答使用synchronized, 那么还有其他方式吗? 答案是肯定的, 另外一种方式也就是本文要说的Th ...

  7. window.location.href = window.location.href 跳转无反应 a 超链接 onclick 点击跳转无反应

    错误写法 , 主要是在 href="#"这里 <a href="#" id="send" onclick="return b ...

  8. JavaScript 位运算总结&拾遗

    最近补充了一些位运算的知识,深感位运算的博大精深,此文作为这个系列的总结篇,在此回顾下所学的位运算知识和应用,同时也补充下前文中没有提到的一些位运算知识. 把一个数变为大于等于该数的最小的2的幂 一个 ...

  9. DOM之parentNode与offsetParent

    DOM中有两个属性parentNode和offsetParent,想必区别大家都是知道的,可用法上还是有一些需要注意的地方,尤其是后者,想知道吗?继续往下看咯. parentNode指的是父节点,el ...

  10. ASP.NET MVC 多语言实现技巧 最简、最易维护和最快速开发

    说说传统做法的缺点 1.做过多语言的都知道这玩意儿太花时间 2.多语言架构一般使用资源文件.XML或者存储数据库来实现.这样就在一定程序上降低了性能 3.页面的可读性变差,需要和资源文件进行来回切换 ...