Splay不加反转(Push_down)版本,求区间最大值,维护每个点的子树的整个sum和
中间(内部)最大值:msum,lsum(左侧连续最大值)rsum右侧连续最大值,和线段树基本一致)
splay(int &x,int pos)是指把现在x这个根的子树做变化,使得这个根变成这个子树里面第pos位(中序遍历)splay整棵树的中序遍历就是我们维护的动态数组,比如添加一个数到数组里第5个位置的时候,可以考虑根的左儿子有3个,根就是第4个,如果根的右儿子是第5个,那么显然根的右儿子的左儿子添加数字的话就正好插在整个树的第5个,操作就是把4先旋到整个树的根,再把旋完的跟的右子树的根旋成这个子树的第1个,这个左儿子就是空的了,把要插的插进去,其余操作都相同

/*
Splay不加反转(Push_down)版本,求区间最大值,维护每个点的子树的整个sum和
中间(内部)最大值:msum,lsum(左侧连续最大值)rsum右侧连续最大值,和线段树基本一致)
*/#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 200009;
const int inf = 2000000000+1;
int siz[maxn],s[maxn][2],tot,val[maxn],n,m;
int lsum[maxn];   //[left, x)
int rsum[maxn];   //(x, right]
int msum[maxn],sum[maxn];   //m:inside
#define ls s[x][0]
#define rs s[x][1]
int p,root;
int fd(int x,int k){//-1:根 1:右 0:左if(ls == -1){if(k == 1) return -1;else return 1;}else{if(k <= siz[ls]) return 0;else if(k == siz[ls]+1) return -1;else return 1;}
}
void Push_up(int x){siz[x] = (ls==-1?0:siz[ls])+(rs==-1?0:siz[rs])+1;sum[x] =  val[x] + (ls == -1?0:sum[ls])+ (rs == -1?0:sum[rs]);if(ls == -1 && rs == -1){lsum[x] = rsum[x] = msum[x] = val[x];}else if(ls != -1 && rs != -1){//printf("lsum[%d] = %d  %d\n",ls,lsum[ls],sum[ls]);lsum[x] = max(lsum[ls], sum[ls] + val[x] + max(lsum[rs], 0));rsum[x] = max(rsum[rs], sum[rs] + val[x] + max(rsum[ls], 0));msum[x] = max( max(msum[ls], msum[rs]),val[x] + max(rsum[ls], 0) + max(lsum[rs], 0) );}else if(ls == -1 && rs != -1){lsum[x] = val[x] + max( lsum[rs], 0 );rsum[x] = max(rsum[rs], sum[rs] + val[x] );msum[x] = max(msum[rs],val[x] + max(lsum[rs], 0) );}else{lsum[x] = max(lsum[ls], sum[ls] + val[x] );rsum[x] = val[x] + max(rsum[ls], 0);msum[x] = max(msum[ls],val[x] + max(rsum[ls], 0));}
}
void Rotate(int &x,int d){//d = 0:x右儿子变成跟,1:左变根int k = s[x][d^1];s[x][d^1] = s[k][d];s[k][d] = x;Push_up(x); Push_up(k);x = k;
}
void Splay(int &x,int k){int d = fd(x,k);if(d == -1) return ;if(d == 1) k -= (ls==-1?0:siz[ls])+1;int p = s[x][d];int d2 = fd(p,k),k2;//注释以d = 0为例if(d2 == 0)         k2 = k;else if(d2 == 1)    k2 = k-(s[p][0]==-1?0:siz[ s[p][0] ])-1;if(d2 != -1){Splay(s[p][d2],k2);if(d == d2) Rotate(x,1-d);//两次方向一样,例如都是0(往左的链) 把根的第一个儿子(左边)转到根else        Rotate(s[x][d],1-d2);//两次方向不一样 例如左右,把第一个(根的左边)的右儿子(第二个)转到跟的右侧}Rotate(x,1-d);//跟的左侧转到跟
}
int new_node(int vl){s[tot][0] = s[tot][1] = -1;siz[tot] = 1;val[tot] = lsum[tot] = rsum[tot] = msum[tot] = sum[tot] = vl;return tot++;
}
void Insert(int &x,int pos,int val){//for 1:ro2 1   pos pos-1Splay(x,pos-1);Splay(rs,pos-1-(ls==-1?0:siz[ls]));s[rs][0] = new_node(val);Push_up(rs);Push_up(x);
}
void pre(){tot = 0;root = 0;siz[tot++] = 2;siz[tot++] = 1;s[0][1] = tot-1;s[0][0] = s[1][0] = s[1][1] = -1;for(int i = 0 ; i <= 1; i++)val[i] = sum[i] = lsum[i] = rsum[i] = msum[i] = 0;
}
void out(int x,int h){if(x == -1){return;}out(ls,h+1);cout<<"|";for(int i=0;i<h*4;i++) printf(" ");printf("node %d: val=%d siz=%d\n",x,val[x],siz[x]);out(rs,h+1);
}
void init(){//插到第二个上for(int i = 1; i <= n ; i++){scanf("%d",&p);Insert(root,i+1,p);}//out(root,0);
}
void Del(int &x,int pos){Splay(x,pos-1);Splay(rs,pos+1-1-(ls==-1?0:siz[ls]));//Push_up(x);s[rs][0] = -1;Push_up(rs);Push_up(x);
}
void Qury(int &x,int l,int r){Splay(x,l-1);Splay(rs,r+1-1-(ls==-1?0:siz[ls]));Push_up(rs);Push_up(x);
}
void Rep(int &x,int pos,int vl){Splay(x,pos-1);Splay(rs,pos+1-1-(ls==-1?0:siz[ls]));val[s[rs][0]] = sum[s[rs][0]] = lsum[s[rs][0]] = rsum[s[rs][0]] = msum[s[rs][0]] = vl;Push_up(rs);Push_up(x);
}
char op[3];
int _pos,_add,l,r,vl;
void sov(){scanf("%d",&m);for(int i =1; i <= m ; i++){scanf("%s",op);//cout<<i<<": "<<op<<"\n";if(op[0] == 'I'){scanf("%d%d",&_pos,&_add);Insert(root,_pos+1,_add);}if(op[0] == 'D'){scanf("%d",&_pos);Del(root,_pos+1);}if(op[0] == 'Q'){scanf("%d%d",&l,&r);Qury(root,l+1,r+1);printf("%d\n",msum[ s[ s[root][1] ][ 0 ] ]);}if(op[0] == 'R'){scanf("%d%d",&_pos,&vl);Rep(root,_pos+1,vl);}//out(root,0);//cout<<endl;}
}
int main(){freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);scanf("%d",&n);pre();init();//out(root);sov();
}
/*
5
3 -4 3 -1 6
10
I 6 2
Q 3 5
R 5 -4
Q 3 5
D 2
Q 1 5
I 2 -10
Q 1 6
R 2 -1
Q 1 6
*/

spoj4487(splay)相关推荐

  1. fhq_treap || BZOJ 3223: Tyvj 1729 文艺平衡树 || Luogu P3391 【模板】文艺平衡树(Splay)...

    题面: [模板]文艺平衡树(Splay) 题解:无 代码: 1 #include<cstdio> 2 #include<cstring> 3 #include<iostr ...

  2. 伸展树(Splay)

    伸展树(Splay) Splay 是一种二叉查找树,它通过不断将某个节点旋转到根节点,使得整棵树仍然满足二叉查找树的性质,并且保持平衡而不至于退化为链.它由 Daniel Sleator 和 Robe ...

  3. BZOJ 1503 郁闷的出纳员(splay)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1503 题意:给出一个数列(初始为空),给出一个最小值Min,当数列中的数字小于Min时自动 ...

  4. 平衡树(splay)学习笔记(详细,从入门到精(bao)通(ling))(持续更新)

    前言 在前几天军训站军姿的时候胡思乱想,突然明白了splay的本质 KMP学习笔记后又一篇字数上万的题解- 前置技能--二叉搜索树 首先来看一个最简单的问题: 你需要维护一个数据结构,资磁这些操作: ...

  5. 【BZOJ4864】【BeiJing 2017 Wc】神秘物质(Splay)

    Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子.这 一天, 小诚刚从研究所得到了一块奇异的陨石样本, 便 ...

  6. P3391 【模板】文艺平衡树(Splay)

    Splay #include<cstdio> #include<algorithm> #include<iostream> using namespace std; ...

  7. 【洛谷P3369】普通平衡树(splay)

    emmmmm直接丢代码了 #include<iostream> #include<cstdio> #include<cstring> #include<str ...

  8. 【Luogu】P3224永无乡(splay)

    题目链接 splay模板,启发式合并(其实就是暴力插入)即可. 顺便吐槽时限,带垃圾回收而已--不至于最后一个点死活不让过吧? #include<cstdio> #include<c ...

  9. ●HDU 2871 Memory Control(Splay)

    ●赘述题目 四种操作: ○Reset:将整个内存序列清空. ○New a:在尽量靠左的位置新建一个长度为a的内存块,并输出改内存块起始位置.(各个内存块即使相邻也不会合并..) ○Free a:将a点 ...

  10. 【题解】 bzoj1503: [NOI2004]郁闷的出纳员 (Splay)

    bzoj1503,懒得复制,戳我戳我 Solution: 我知不知道我是那根筋抽了突然来做splay,调了起码\(3h+\),到第二天才改出来(我好菜啊),当做训练调错吧 一个裸的splay,没啥好说 ...

最新文章

  1. redis单机版安装
  2. 《数据驱动安全:数据安全分析、可视化和仪表盘》一2.3 数据帧介绍
  3. (chap6 Http首部) 通用首部字段 DatePragma
  4. 7.定义一个有80个元素的字符数组,从键盘输入一串字符,将其中的大写字母转换为小写字母,而将原来为小写的字母转换为大写字母,其他字符不变。
  5. tomee_OpenLiberty:注入错误,适用于TomEE和Wildfly
  6. Silverlight 设计器加载错误
  7. Flutter异步加载FutureBuilder重绘解决方案
  8. spark内核揭秘-14-Spark性能优化的10大问题及其解决方案
  9. 使用脚本删除ios工程中未使用图片
  10. JDBC 笔记4 PreparedStatement 与Statement 的区别
  11. POI动态下载Excel模板案例
  12. Linux——基础知识及命令
  13. OPNsense用户手册-用户管理
  14. 国内的云主机靠谱吗?万网如何?互联网创业产品选择云主机还是租用独享服务器合适?
  15. 提升自己的认知-思维模型
  16. python爬取京东商品信息_使用selenium爬取京东商品信息
  17. 网页颜色搭配表及颜色搭配技巧
  18. c语言结构体应用例程:输入今天日期,输出明天日期
  19. 【译】基于 Rust 用 Bevy 实现节奏大师游戏
  20. linux cpu 查看微码,intel cpu微码 intel官网下的cpu微码 - 下载 - 搜珍网

热门文章

  1. 【Heydrones】飞手百科第一篇:一定要看的无人机原理总结
  2. node.js中操作数据库
  3. 西餐菜单怎么翻译成英文
  4. excel转置怎么操作_Excel选择性粘贴,那些你不得不会的小技巧
  5. 计算机鼠标左键不起作用,电脑鼠标左键不能用怎么办
  6. 记一次windows系统主引导修复
  7. 基于Python/Flask框架的双色球数据采集(爬虫)及大数据可视化平台设计与实现
  8. 打印机扫描功能不见了_打印机扫描文件找不到路径怎么办?
  9. iOS多张图片合成一个视频
  10. 华为路由设置虚拟服务器命令,华为路由器配置ip命令