【模板】Splay
Splay 均摊复杂度证明见此处 \(\rightarrow\) 链接
代码如下
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
const int inf=0x3f3f3f3f;
struct node{
#define ls(x) t[x].ch[0]
#define rs(x) t[x].ch[1]
int fa,ch[2],val,size,cnt;
}t[maxn];
int tot,root;
inline int get(int x){return x==rs(t[x].fa);}
inline void pushup(int x){
t[x].size=t[ls(x)].size+t[rs(x)].size+t[x].cnt;
}
inline int find(int val){
int x=root;
while(t[x].val!=val&&t[x].ch[t[x].val<val])x=t[x].ch[t[x].val<val];
return x;
}
inline void rotate(int x){
int fa=t[x].fa,gfa=t[fa].fa;
int d1=get(x),d2=get(fa);
t[fa].ch[d1]=t[x].ch[d1^1],t[t[x].ch[d1^1]].fa=fa;
t[x].ch[d1^1]=fa,t[fa].fa=x;
t[x].fa=gfa,t[gfa].ch[d2]=x;
pushup(fa),pushup(x);
}
inline void splay(int x,int goal){
while(t[x].fa!=goal){
int fa=t[x].fa,gfa=t[fa].fa;
if(gfa!=goal)get(x)==get(fa)?rotate(fa):rotate(x);
rotate(x);
}
if(!goal)root=x;
}
void insert(int val){
int x=root,fa=0;
while(x&&t[x].val!=val)fa=x,x=t[x].ch[t[x].val<val];
if(x)++t[x].cnt;
else{
x=++tot;
if(fa)t[fa].ch[t[fa].val<val]=x;
t[x].fa=fa,t[x].val=val,t[x].cnt=t[x].size=1;
}
splay(x,0);
}
int kth(int x,int k){
if(k<=t[ls(x)].size)return kth(ls(x),k);
else if(k>t[ls(x)].size+t[x].cnt)return kth(rs(x),k-t[ls(x)].size-t[x].cnt);
else return t[x].val;
}
int getrank(int val){
splay(find(val),0);
return t[ls(root)].size;
}
int getpre(int val){
splay(find(val),0);
if(t[root].val<val)return root;
int x=ls(root);
while(rs(x))x=rs(x);
return x;
}
int getnxt(int val){
splay(find(val),0);
if(t[root].val>val)return root;
int x=rs(root);
while(ls(x))x=ls(x);
return x;
}
void remove(int val){
int pre=getpre(val),nxt=getnxt(val);
splay(pre,0),splay(nxt,pre);
if(t[ls(nxt)].cnt>1)--t[ls(nxt)].cnt,splay(ls(nxt),0);
else ls(nxt)=0,splay(nxt,0);
}
void initial(){insert(-inf),insert(inf);}
int main(){
initial();
int opt,val,n;
scanf("%d",&n);
while(n--){
scanf("%d%d",&opt,&val);
switch(opt){
case 1:insert(val);break;
case 2:remove(val);break;
case 3:printf("%d\n",getrank(val));break;
case 4:printf("%d\n",kth(root,val+1));break;
case 5:printf("%d\n",t[getpre(val)].val);break;
case 6:printf("%d\n",t[getnxt(val)].val);break;
}
}
return 0;
}
【模板】Splay的更多相关文章
- 算法模板——splay区间反转 2
实现功能:同splay区间反转 1(基于BZOJ3223 文艺平衡树) 这次改用了一个全新的模板(HansBug:琢磨了我大半天啊有木有),大大简化了程序,同时对于splay的功能也有所完善 这里面没 ...
- 算法模板——splay区间反转 1
实现的功能:将序列区间反转,并维护 详见BZOJ3223 var i,j,k,l,m,n,head,a1,a2:longint; s1:ansistring; a,b,c,d,fat,lef,rig: ...
- 【luogu P3369 普通平衡树(Treap/SBT)】 模板 Splay
题目链接:https://www.luogu.org/problemnew/show/P3369 #include <cstdio> #include <algorithm> ...
- 洛谷 P3391 模板Splay
#include<bits/stdc++.h> using namespace std; #define maxn 200000 int read() { ,w=; ;ch=getchar ...
- [模板] Splay
欠了好久的Splay,以后就它了. 默写真不容易,过几天估计就忘了.. 整个Splay真的精妙,不拖泥带水那种.. 前驱后继之所以不能用rk转到根,是因为这个数不一定存在.. kth中<=老忘记 ...
- 模板—splay
#include<iostream> #include<cstdio> #define cin(x) scanf("%d",&x) using na ...
- 模板——Splay
$Splay$ #include <bits/stdc++.h> #define inf (int)1e9 using namespace std; const int N=1e5+100 ...
- Splay 伸展树
废话不说,有篇论文可供参考:杨思雨:<伸展树的基本操作与应用> Splay的好处可以快速分裂和合并. ===============================14.07.26更新== ...
- [NOI2003][bzoj1507] 文本编辑器 editor [splay]
其实看明白了就是一道水题 毕竟模板 splay敲一发,插入一个串的时候先把它构建成一棵平衡树,再挂到原来的splay上面去即可 没别的了,上代码 #include<iostream> #i ...
- splay最终模板
来自wjmzbmr的splay模板 #include<cstdio> #include<iostream> #include<algorithm> using na ...
随机推荐
- Centos7部署elasticsearch并且安装ik分词以及插件kibana
第一步 下载对应的安装包 elasticsearch下载地址:https://www.elastic.co/cn/downloads/elasticsearch ik分词下载:https://gith ...
- Android环境准备
Android环境准备: 1.安装Java环境(自行安装) 2.下载Android SDK包 3.配置系统环境变量 新建ANDROID_HOME 变量值:SDK安装路径(如:D:\android-sd ...
- 磁盘挂载问题:Fdisk最大只能创建2T分区的盘,超过2T使用parted
需求说明:云服务器上买了一块8T的磁盘,准备挂载到服务器上的/data目录下. ===================================parted命令说明=============== ...
- tableView优化思路
一般优化的思路: 提前计算并缓存好高度(布局),因为heightForRowAtIndexPath:是调用最频繁的方法. 复杂界面可采用异步绘制. 在大量图片展示时,可以滑动时按需加载. 尽量少用或不 ...
- vs2013——单元测试&& 性能图
一.如何创建单元测试 下面这个博客中写的很详细: http://***/Article/11186 其中需要注意的是,首先新建工程项目,在此目录下Add单元测试项目,还需要在单元测试项目中引用被测试的 ...
- Linux实践一:问题及解决
安装ubuntu出现的问题 : 打开镜像.iso文件,v-box好像是不识别这种格式的,它识别的好像是.vdi等格式,所以要用vm虚拟机打开镜像安装 打开镜像,按照步骤安装后,安装很久后,出现问题.初 ...
- 关于本科毕业论文《Laguerre小波在数值积分与微分方程数值解中的应用》存在的问题与小结
本科的毕业设计<Laguerre小波在数值积分与微分方程数值解中的应用>是通过Laguerre小波函数来近似表达某个需要求积分或解微分方程的函数,将原函数很难求得函数用小波函数表达出来,这 ...
- Leetcode 279. 完全平方数
题目描述: https://leetcode-cn.com/problems/perfect-squares/ 解题思路: 同样是dp,一开始的想法是,对于每个数i做拆分为j和(i-j),利用动态转移 ...
- BugPhobia进阶篇章:功能规格说明书
0x01 :特别鸣谢 首先特别鸣谢<构建之法>中并没有给出固定化格式的功能规格说明书的样例,因此在此次的说明书中将尽可能用生动形象的例子展示软件交互阐释 因此受到它本身的启发,此次团队功能 ...
- PHP加密与编码技术
md5加密: string md5( string $str [,bool $raw output=false]) md5加密方法用的挺多,有两个参数,第一个参数是要加密的字符串,第二个参数默认为f ...