【题意】给定含有n个0的的数列。

1.区间加值

2.区间翻转

3.区间求最大值

【算法】平衡树(fhq-treap)

需要特别注意的是:

1.使0点对全局无影响并全程保持(例如求max,t[0].mx=-inf)

2.平衡树和线段树的上传区别在于要考虑本身这个点。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=;
struct tree{int l,r,rnd,num,mx,add,delta,sz;}t[maxn*];
int st[maxn];
int n,m,root;
void down(int k){
if(t[k].delta){
swap(t[k].l,t[k].r);
if(t[k].l)t[t[k].l].delta^=;
if(t[k].r)t[t[k].r].delta^=;
t[k].delta=;
}
if(t[k].add){
int p=t[k].add;
if(t[k].l)t[t[k].l].add+=p,t[t[k].l].mx+=p,t[t[k].l].num+=p;
if(t[k].r)t[t[k].r].add+=p,t[t[k].r].mx+=p,t[t[k].r].num+=p;//keep 0->0!!!
t[k].add=;
}
}
int max(int a,int b){return a<b?b:a;}
void up(int k){//different from sgt!
t[k].mx=max(t[k].num,max(t[t[k].l].mx,t[t[k].r].mx));
t[k].sz=+t[t[k].l].sz+t[t[k].r].sz;
}
void dfs(int k){
if(!k)return;
dfs(t[k].l);
dfs(t[k].r);
up(k);
}
void build(){
int top=;
for(int i=;i<=n;i++){
t[i]=(tree){,,rand(),,,,,};
while(top&&t[st[top]].rnd>t[i].rnd){
t[st[top]].r=t[i].l;
t[i].l=st[top--];
}
t[st[top]].r=i;
st[++top]=i;
}
dfs(st[]);
t[].r=;
t[].mx=-0x3f3f3f3f;//make 0 no influence
root=st[];
}
int merge(int a,int b){
if(!a||!b)return a^b;
if(t[a].rnd<t[b].rnd){
down(a);
t[a].r=merge(t[a].r,b);
up(a);
return a;
}
else{
down(b);
t[b].l=merge(a,t[b].l);
up(b);
return b;
}
}
void split(int k,int &l,int &r,int x){
if(!k)return void(l=r=);
down(k);
if(x<t[t[k].l].sz+){
r=k;
split(t[k].l,l,t[k].l,x);
}
else{
l=k;
split(t[k].r,t[k].r,r,x-t[t[k].l].sz-);
}
up(k);
}
void plus(int l,int r,int x){
int a,b,c;
split(root,b,c,r);
split(b,a,b,l-);
t[b].add+=x;t[b].mx+=x;t[b].num+=x;
root=merge(a,b);root=merge(root,c);
}
void turn(int l,int r){
int a,b,c;
split(root,b,c,r);split(b,a,b,l-);
t[b].delta^=;
root=merge(a,b);root=merge(root,c);
}
int ask(int l,int r){
int a,b,c,ans;
split(root,b,c,r);split(b,a,b,l-);
ans=t[b].mx;
root=merge(a,b);root=merge(root,c);
return ans;
}
int main(){
srand();
scanf("%d%d",&n,&m);
build();
for(int i=;i<=m;i++){
int k,l,r,x;
scanf("%d%d%d",&k,&l,&r);
if(l>r)continue;
if(k==){
scanf("%d",&x);
plus(l,r,x);
}
else if(k==)turn(l,r);
else printf("%d\n",ask(l,r));
}
return ;
}

【BZOJ】1251: 序列终结者的更多相关文章

  1. BZOJ 1251 序列终结者(Splay)

    题目大意 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技术 ...

  2. BZOJ 1251: 序列终结者 [splay]

    1251: 序列终结者 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 3778  Solved: 1583[Submit][Status][Discu ...

  3. BZOJ 1251: 序列终结者

    1251: 序列终结者 Time Limit: 20 Sec  Memory Limit: 162 MB Submit: 3773  Solved: 1579 [Submit][Status][Dis ...

  4. bzoj 1251序列终结者 splay 区间翻转,最值,区间更新

    序列终结者 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 4594  Solved: 1939[Submit][Status][Discuss] De ...

  5. bzoj 1251: 序列终结者 平衡树,fhqtreap

    链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1251 思路 好简单的模板题 不过还是wrong了好几发 叶子节点要注意下,不能使用 遇到就不 ...

  6. 【BZOJ】1251: 序列终结者(splay)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1251 不行..为什么写个splay老是犯逗,这次又是null的mx没有赋值-maxlongint.. ...

  7. 1251. 序列终结者【平衡树-splay】

    Description 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这 ...

  8. 【bzoj1251】序列终结者(伸展树)

    [bzoj1251]序列终结者(伸展树) Description 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我 ...

  9. 【BZOJ】【1251】序列终结者

    Splay 还是splay序列维护,这题我WA了的原因是:在Push_up的时候,当前子树的max我是直接取的L.R和v[x]的最大值,但是如果没有左/右儿子,默认是会访问0号结点的mx值,而这个值没 ...

随机推荐

  1. SQL 语句(增删改查)

    一.增:有4种方法1.使用insert插入单行数据: --语法:insert [into] <表名> [列名] values <列值> 例:insert into Strden ...

  2. scrum 项目准备1.0

    ---3.0--------------------------------------------------------------------- 5.Scrum团队成立 5.1 团队名称,团队目 ...

  3. Node.js系列——(3)连接DB

    背景 node.js,有人称之为运行在服务器端的JavaScript.以往我们使用JavaScript时,都是依赖后端查询数据库并返回数据,而JavaScript只需要展示即可.问题来了,就不能绕开后 ...

  4. Sass & Scss & CSS3

    Sass & Scss & CSS3 Sass & Scss @mixin & @include & @import & variable https: ...

  5. Winform程序在XP系统上双击运行无反应解决方法

    右键程序,打开属性栏,在兼容性选项里以兼容模式运行该程序即可解决.

  6. Linux服务器开启tomcat的gc日志

    压力测试,为了能监控长期对gc的变化的情况,那么就需要在tomcat中进行配置相关的gc输入日志,以便后续来对gc中进行分析 工具 :linux+tomcat 1.进入到了tomcat的bin的目录下 ...

  7. 第163天:js面向对象-对象创建方式总结

    面向对象-对象创建方式总结 1. 创建对象的方式,json方式 推荐使用的场合: 作为函数的参数,临时只用一次的场景.比如设置函数原型对象. var obj = {}; //对象有自己的 属性 和 行 ...

  8. [十六]SpringBoot 之 读取环境变量和绑定属性对象

    1.读取环境变量 凡是被spring管理的类,实现接口EnvironmentAware 重写方法 setEnvironment 可以在工程启动时,获取到系统环境变量和application配置文件中的 ...

  9. 【转】大数据分析(Big Data OLAP)引擎Dremel, Tenzing 以及Impala

    引自:http://blog.csdn.net/xhanfriend/article/details/8434896 对于数据分析师来说,SQL是主要的语言. Hive为Hadoop提供了支持SQL运 ...

  10. Linux内核设计第四周学习总结 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    陈巧然原创作品 转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的: 使用库函数A ...