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代表这个位 ...
随机推荐
- Biopython常用功能模块
Biopython项目是旨在减少计算生物学中代码重复的开源项目之一,由国际开发人员协会创建. 它包含表示生物序列和序列注释的类,并且能够读取和写入各种文件格式(FASTA,FASTQ,GenBank和 ...
- linux下的函数dirname()和basename()使用
总览 #include <libgen.h> char *dirname(char *path); char *basename(char *path); 说明 函数以 '/' 为分隔符 ...
- Golang : pflag 包简介
笔者在前文中介绍了 Golang 标准库中 flag 包的用法,事实上有一个第三方的命令行参数解析包 pflag 比 flag 包使用的更为广泛.pflag 包的设计目的就是替代标准库中的 flag ...
- Codeforces Round #459 (Div. 2):D. MADMAX(记忆化搜索+博弈论)
题意 在一个有向无环图上,两个人分别从一个点出发,两人轮流从当前点沿着某条边移动,要求经过的边权不小于上一轮对方经过的边权(ASCII码),如果一方不能移动,则判负.两人都采取最优策略,求两人分别从每 ...
- 转载-聊一聊深度学习的activation function
目录 1. 背景 2. 深度学习中常见的激活函数 2.1 Sigmoid函数 2.2 tanh函数 2.3 ReLU函数 2.4 Leaky ReLu函数 2.5 ELU(Exponential Li ...
- underscore.js and moment.js
underscore.js and moment.js underscore.js 一.简介Underscore.js是一个JavaScript实用库,提供了一整套函数式编程的实用功能.它提供了100 ...
- 3dmax沿立方体边扩展出面
这个做法有问题,接缝问题处理起来很麻烦,立方体与平面的拼接基本就做不到 做建筑时,一般先做墙,然后通过墙扩展出地表,这么做可以保证墙和地表是一体的,避免产生缝隙 1 新建2个Cube 2 转换为可编辑 ...
- HTTPRunner实践二——数据驱动
基于文档http://cn.httprunner.org/advanced/data-driven/ 场景一:用例集+独立参数+参数列表 1.原始用例文件savePatient_01.yml - co ...
- Linux对外提供服务 网络操作 端口操作 1.开启服务监听端口 2.设置防火墙,放行访问端口的包 iptables&netfilter 四表五链和通堵策略
主题: Linux服务器上软件提供服务 1.网络操作 2.端口操作 1.网络操作 本机必须能够ping通目标主机(本地虚拟机或者远程主机) 2.端口操作 1.开启服务监听端口 2.设置防火墙,放行访问 ...
- [Java]HashMap实现与哈希冲突,与HashTable的区别
对于 Map ,最直观就是理解就是键值对,映射,key-value 形式.一个映射不能包含重复的键,一个键只能有一个值.平常我们使用的时候,最常用的无非就是 HashMap. HashMap 实现了 ...