LibreOJ #2037. 「SHOI2015」脑洞治疗仪



线段树区间合并问题
恶心。。。
#include <cstdio>
#define N 200005 struct Segment
{
int l,r,mid,sum,lm,rm,m,len,flag;
Segment * ch[];
Segment ()
{
ch[]=ch[]=NULL;
lm=rm=m=;
flag=-;
}
}*root=new Segment;
int n,m,tmp,ans,nowl;
inline int max(int a,int b) {return a>b?a:b;}
inline void pushdown(Segment *&k)
{
if(k->flag!=-)
{
k->ch[]->flag=k->ch[]->flag=k->flag;
k->ch[]->sum=k->ch[]->len*k->flag;
k->ch[]->sum=k->ch[]->len*k->flag;
if(k->flag==) k->ch[]->lm=k->ch[]->rm=k->ch[]->m=k->ch[]->len,k->ch[]->lm=k->ch[]->rm=k->ch[]->m=k->ch[]->len;
else k->ch[]->lm=k->ch[]->rm=k->ch[]->m=k->ch[]->lm=k->ch[]->rm=k->ch[]->m=;
k->flag=-;
}
}
inline void pushup(Segment *&k)
{
k->sum=k->ch[]->sum+k->ch[]->sum;
if(!k->ch[]->sum) k->lm=k->ch[]->lm+k->ch[]->lm;
else k->lm=k->ch[]->lm;
if(!k->ch[]->sum) k->rm=k->ch[]->rm+k->ch[]->rm;
else k->rm=k->ch[]->rm;
k->m=max(max(k->ch[]->m,k->ch[]->m),k->ch[]->rm+k->ch[]->lm);
}
void build(Segment * &k,int l,int r)
{
k=new Segment;
k->l=l;
k->r=r;
k->len=r-l+;
if(l==r) {return;}
k->mid=(l+r)>>;
build(k->ch[],l,k->mid);
build(k->ch[],k->mid+,r);
pushup(k);
}
void change_to_nd(Segment *&k,int l,int r)
{
if(l<=k->l&&k->r<=r)
{
k->sum=;
k->flag=;
k->lm=k->rm=k->len;
return;
}
pushdown(k);
if(l<=k->mid) change_to_nd(k->ch[],l,r);
if(r>k->mid) change_to_nd(k->ch[],l,r);
pushup(k);
}
void change_to_nzz(Segment *&k,int l,int r)
{
if(!tmp)
return;
if(l<=k->l&&k->r<=r&&tmp>=k->len-k->sum)
{
tmp-=k->len-k->sum;
k->flag=;
k->m=k->lm=k->rm=;
k->sum=k->len;
return;
}
pushdown(k);
if(l<=k->mid) change_to_nzz(k->ch[],l,r);
if(r>k->mid) change_to_nzz(k->ch[],l,r);
pushup(k);
}
int ask(Segment *&k,int l,int r)
{
if(k->l==l&&k->r==r) return k->sum;
pushdown(k);
if(l>k->mid) return ask(k->ch[],l,r);
else if(r<=k->mid) return ask(k->ch[],l,r);
else return ask(k->ch[],l,k->mid)+ask(k->ch[],k->mid+,r);
}
void query(Segment *&k,int l,int r)
{
if(l<=k->l&&k->r<=r)
{
ans=max(ans,k->m);
ans=max(ans,nowl+k->lm);
if(k->rm==k->len) nowl+=k->len;
else nowl=k->rm;
return;
}
pushdown(k);
if(l<=k->mid) query(k->ch[],l,r);
if(r>k->mid) query(k->ch[],l,r);
}
int Main()
{
scanf("%d%d",&n,&m);
build(root,,n);
root->sum=root->len;
root->flag=;
for(int opt,l,r,L,R;m--;)
{
scanf("%d%d%d",&opt,&l,&r);
if(!opt) change_to_nd(root,l,r);
else if(opt==)
{
scanf("%d%d",&L,&R);
tmp=ask(root,l,r);
change_to_nd(root,l,r);
change_to_nzz(root,L,R);
}
else nowl=,ans=,query(root,l,r),printf("%d\n",ans);
}
return ;
}
int sb=Main();
int main(int argc,char *argv[]) {;}
LibreOJ #2037. 「SHOI2015」脑洞治疗仪的更多相关文章
- loj #2037. 「SHOI2015」脑洞治疗仪
#2037. 「SHOI2015」脑洞治疗仪 题目描述 曾经发明了自动刷题机的发明家 SHTSC 又公开了他的新发明:脑洞治疗仪——一种可以治疗他因为发明而日益增大的脑洞的神秘装置. 为了简单起见 ...
- 【LOJ】#2037. 「SHOI2015」脑洞治疗仪
题解 维护区间内1的个数,左边数0的长度,右边数0的长度,区间内0区间最长个数,覆盖标记 第一种操作区间覆盖0 第二种操作查询\([l_0,r_0]\)中1的个数,区间覆盖0,然后覆盖时找到相对应的区 ...
- LibreOJ #2036. 「SHOI2015」自动刷题机
#2036. 「SHOI2015」自动刷题机 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 题目描述 曾经发明了信号增幅仪的发明家 SHTSC 又公开 ...
- loj#2038. 「SHOI2015」超能粒子炮・改
题目链接 loj#2038. 「SHOI2015」超能粒子炮・改 题解 卢卡斯定理 之后对于%p分类 剩下的是个子问题递归 n,k小于p的S可以预处理,C可以卢卡斯算 代码 #include<c ...
- [LOJ 2039] 「SHOI2015」激光发生器
[LOJ 2039] 「SHOI2015」激光发生器 链接 链接 题解 分为两个部分 第一个是求直线之间的交点找到第一个触碰到的镜面 第二个是求直线经过镜面反射之后的出射光线 第一个很好做,第二个就是 ...
- 「SHOI2015」超能粒子炮・改
「SHOI2015」超能粒子炮・改 给你\(T\)组询问,每组询问给定参数\(n,k\),计算\(\sum\limits_{i=0}^k\dbinom{n}{i}\). \(T\leq10^5,n,k ...
- LibreOJ 2003. 「SDOI2017」新生舞会 基础01分数规划 最大权匹配
#2003. 「SDOI2017」新生舞会 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
- LibreOJ #2006. 「SCOI2015」小凸玩矩阵 二分答案+二分匹配
#2006. 「SCOI2015」小凸玩矩阵 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
- 【SHOI2015】脑洞治疗仪(恶心的线段树,区间最大子段和)
题目描述: 曾经发明了自动刷题机的发明家 SHTSC 又公开了他的新发明:脑洞治疗仪——一种可以治疗他因为发明而日益增大的脑洞的神秘装置. 为了简单起见,我们将大脑视作一个 01 序列.11代表这个位 ...
随机推荐
- Struts result param详细设置
<</span>result type="json"> <</span>param name="root">da ...
- HDU - 1546 ZOJ - 2750 Idiomatic Phrases Game 成语接龙SPFA+map
Idiomatic Phrases Game Tom is playing a game called Idiomatic Phrases Game. An idiom consists of sev ...
- CentOS7 环境下MySQL5.7 PHP7的安装
用的都是最新版的包 : php7 mysql5.7 nginx1.8 zabbix3.2.6 替换源为阿里云的源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/ ...
- <!--[if !IE]> 的用法
除IE外都可识别
- 3dmax导出缩放
参考 http://blog.dou.li/unity3d-import-3dmax-model-scale.html http://blog.csdn.net/pdw_jsp/article/det ...
- bzoj 2535: [Noi2010]Plane 航空管制2【拓扑排序+堆】
有个容易混的概念就是第一问的答案不是k[i]字典序最小即可,是要求k[i]大的尽量靠后,因为这里前面选的时候是对后面有影响的(比如两条链a->b c->d,ka=4,kb=2,kc=3,k ...
- String,StringBuffer和StringBuilder
String,StringBuffer和StringBuilder分别应该在什么情况下使用? String 是Java的字符串类,其实质上也是用Char类型存储的,但是除了hash属性,其他的属性都声 ...
- docker安装及概述
相关快捷键 退出:Ctrl-D or exit detach:Ctrl-P + Ctrl-Q Docker 核心技术 1.Namespace — 实现Container的进程.网络.消息.文件系统和主 ...
- snipaste截图软件
- Corn Fields(模板)
题目链接 #include <stdio.h> #include <algorithm> #include <string.h> #include <iost ...