【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小利用函数式线段树的减法操作.对于两棵树的合并 ...
随机推荐
- CLR Table-Valued函数
这几天来,努力学习了CLR的存储过程,创建与部署.从普通的存储过程,带参数,以及Output返回值等. Insus.NET今天学习一个例子,怎样实现CLR Table-Valued函数.在数据库中,我 ...
- Palindrome Linked List
Given a singly linked list, determine if it is a palindrome. Follow up:Could you do it in O(n) time ...
- js 随笔
setInterval:即使在方法中使用了stopInterval这个方法也要执行完才会停止自行重复执行,解决:使用return false来跳出方法. JS string和num:当一个是字符串数字 ...
- 帆软FineReport如何使用程序数据集
大多数情况下,FineReport直接在设计器里使用“数据集查询”,直接写SQL就能满足报表要求,但对于一些复杂的报表,有时候SQL处理并不方便,这时可以把查询结果在应用层做一些预处理后,再传递给报表 ...
- Chrome扩展开发之二——Chrome扩展中脚本的运行机制和通信方式
目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...
- ThreadLocal原理及其实际应用
前言 java猿在面试中,经常会被问到1个问题: java实现同步有哪几种方式? 大家一般都会回答使用synchronized, 那么还有其他方式吗? 答案是肯定的, 另外一种方式也就是本文要说的Th ...
- window.location.href = window.location.href 跳转无反应 a 超链接 onclick 点击跳转无反应
错误写法 , 主要是在 href="#"这里 <a href="#" id="send" onclick="return b ...
- JavaScript 位运算总结&拾遗
最近补充了一些位运算的知识,深感位运算的博大精深,此文作为这个系列的总结篇,在此回顾下所学的位运算知识和应用,同时也补充下前文中没有提到的一些位运算知识. 把一个数变为大于等于该数的最小的2的幂 一个 ...
- DOM之parentNode与offsetParent
DOM中有两个属性parentNode和offsetParent,想必区别大家都是知道的,可用法上还是有一些需要注意的地方,尤其是后者,想知道吗?继续往下看咯. parentNode指的是父节点,el ...
- ASP.NET MVC 多语言实现技巧 最简、最易维护和最快速开发
说说传统做法的缺点 1.做过多语言的都知道这玩意儿太花时间 2.多语言架构一般使用资源文件.XML或者存储数据库来实现.这样就在一定程序上降低了性能 3.页面的可读性变差,需要和资源文件进行来回切换 ...