线段树区间合并问题

恶心。。。

屠龙宝刀点击就送

#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」脑洞治疗仪的更多相关文章

  1. loj #2037. 「SHOI2015」脑洞治疗仪

    #2037. 「SHOI2015」脑洞治疗仪   题目描述 曾经发明了自动刷题机的发明家 SHTSC 又公开了他的新发明:脑洞治疗仪——一种可以治疗他因为发明而日益增大的脑洞的神秘装置. 为了简单起见 ...

  2. 【LOJ】#2037. 「SHOI2015」脑洞治疗仪

    题解 维护区间内1的个数,左边数0的长度,右边数0的长度,区间内0区间最长个数,覆盖标记 第一种操作区间覆盖0 第二种操作查询\([l_0,r_0]\)中1的个数,区间覆盖0,然后覆盖时找到相对应的区 ...

  3. LibreOJ #2036. 「SHOI2015」自动刷题机

    #2036. 「SHOI2015」自动刷题机 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 题目描述 曾经发明了信号增幅仪的发明家 SHTSC 又公开 ...

  4. loj#2038. 「SHOI2015」超能粒子炮・改

    题目链接 loj#2038. 「SHOI2015」超能粒子炮・改 题解 卢卡斯定理 之后对于%p分类 剩下的是个子问题递归 n,k小于p的S可以预处理,C可以卢卡斯算 代码 #include<c ...

  5. [LOJ 2039] 「SHOI2015」激光发生器

    [LOJ 2039] 「SHOI2015」激光发生器 链接 链接 题解 分为两个部分 第一个是求直线之间的交点找到第一个触碰到的镜面 第二个是求直线经过镜面反射之后的出射光线 第一个很好做,第二个就是 ...

  6. 「SHOI2015」超能粒子炮・改

    「SHOI2015」超能粒子炮・改 给你\(T\)组询问,每组询问给定参数\(n,k\),计算\(\sum\limits_{i=0}^k\dbinom{n}{i}\). \(T\leq10^5,n,k ...

  7. LibreOJ 2003. 「SDOI2017」新生舞会 基础01分数规划 最大权匹配

    #2003. 「SDOI2017」新生舞会 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  8. LibreOJ #2006. 「SCOI2015」小凸玩矩阵 二分答案+二分匹配

    #2006. 「SCOI2015」小凸玩矩阵 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  9. 【SHOI2015】脑洞治疗仪(恶心的线段树,区间最大子段和)

    题目描述: 曾经发明了自动刷题机的发明家 SHTSC 又公开了他的新发明:脑洞治疗仪——一种可以治疗他因为发明而日益增大的脑洞的神秘装置. 为了简单起见,我们将大脑视作一个 01 序列.11代表这个位 ...

随机推荐

  1. Biopython常用功能模块

    Biopython项目是旨在减少计算生物学中代码重复的开源项目之一,由国际开发人员协会创建. 它包含表示生物序列和序列注释的类,并且能够读取和写入各种文件格式(FASTA,FASTQ,GenBank和 ...

  2. linux下的函数dirname()和basename()使用

    总览 #include <libgen.h> char *dirname(char *path); char *basename(char *path); 说明 函数以 '/' 为分隔符 ...

  3. Golang : pflag 包简介

    笔者在前文中介绍了 Golang 标准库中 flag 包的用法,事实上有一个第三方的命令行参数解析包 pflag 比 flag 包使用的更为广泛.pflag 包的设计目的就是替代标准库中的 flag ...

  4. Codeforces Round #459 (Div. 2):D. MADMAX(记忆化搜索+博弈论)

    题意 在一个有向无环图上,两个人分别从一个点出发,两人轮流从当前点沿着某条边移动,要求经过的边权不小于上一轮对方经过的边权(ASCII码),如果一方不能移动,则判负.两人都采取最优策略,求两人分别从每 ...

  5. 转载-聊一聊深度学习的activation function

    目录 1. 背景 2. 深度学习中常见的激活函数 2.1 Sigmoid函数 2.2 tanh函数 2.3 ReLU函数 2.4 Leaky ReLu函数 2.5 ELU(Exponential Li ...

  6. underscore.js and moment.js

    underscore.js and moment.js underscore.js 一.简介Underscore.js是一个JavaScript实用库,提供了一整套函数式编程的实用功能.它提供了100 ...

  7. 3dmax沿立方体边扩展出面

    这个做法有问题,接缝问题处理起来很麻烦,立方体与平面的拼接基本就做不到 做建筑时,一般先做墙,然后通过墙扩展出地表,这么做可以保证墙和地表是一体的,避免产生缝隙 1 新建2个Cube 2 转换为可编辑 ...

  8. HTTPRunner实践二——数据驱动

    基于文档http://cn.httprunner.org/advanced/data-driven/ 场景一:用例集+独立参数+参数列表 1.原始用例文件savePatient_01.yml - co ...

  9. Linux对外提供服务 网络操作 端口操作 1.开启服务监听端口 2.设置防火墙,放行访问端口的包 iptables&netfilter 四表五链和通堵策略

    主题: Linux服务器上软件提供服务 1.网络操作 2.端口操作 1.网络操作 本机必须能够ping通目标主机(本地虚拟机或者远程主机) 2.端口操作 1.开启服务监听端口 2.设置防火墙,放行访问 ...

  10. [Java]HashMap实现与哈希冲突,与HashTable的区别

    对于 Map ,最直观就是理解就是键值对,映射,key-value 形式.一个映射不能包含重复的键,一个键只能有一个值.平常我们使用的时候,最常用的无非就是 HashMap. HashMap 实现了 ...