Code:

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=400006;
int ch[maxn][2],f[maxn],siz[maxn],num[maxn],val[maxn];
int root,cnt;
int get(int x){return ch[f[x]][1]==x;}
void pushup(int x){siz[x]=num[x]+siz[ch[x][0]]+siz[ch[x][1]];}
void rotate(int x)
{
int old=f[x],oldf=f[old],which=get(x);
ch[old][which]=ch[x][which^1],f[ch[old][which]]=old;
ch[x][which^1]=old,f[old]=x,f[x]=oldf;
if(oldf)ch[oldf][ch[oldf][1]==old]=x;
pushup(old);pushup(x);
}
int findx(int x){
int p=root;
while(val[p]!=x)p=ch[p][x>val[p]];
return p;
}
void splay(int x,int& tar){
int a=f[tar];
for(int fa;(fa=f[x])!=a;rotate(x))
if(f[fa]!=a)rotate(get(x)==get(fa)?fa:x);
tar=x;
}
int x_rank(int x){
splay(findx(x),root);return siz[ch[root][0]]+1;
}
int rank_x(int x){
int p=root;
while(1){
if(x<=siz[ch[p][0]])p=ch[p][0];
else {
x-=(siz[ch[p][0]]+num[p]);
if(x<=0){splay(p,root);return val[p];}
p=ch[p][1];
}
}
}
int pre_x(int x){
int ans;
int p=root;
while(p){
if(val[p]<x){ans=val[p];p=ch[p][1];}
else p=ch[p][0];
}
return ans;
}
int aft_x(int x){
int ans;
int p=root;
while(p){
if(val[p]>x){ans=val[p],p=ch[p][0];}
else p=ch[p][1];
}
return ans;
}
void insert_x(int x){
if(!root){
++cnt;root=cnt,val[root]=x,num[root]=1;pushup(root);return;
}
int p,fa;
p=fa=root;
while(p&&val[p]!=x)fa=p,p=ch[p][x>val[p]];
if(!p){
++cnt;val[cnt]=x,num[cnt]=1,f[cnt]=fa,ch[fa][x>val[fa]]=cnt;
pushup(cnt);splay(cnt,root);return;
}
++num[p];pushup(p);splay(p,root);
}
void delete_x(int x){
int p=findx(x);splay(p,root);
if(num[root]>1){--num[root];pushup(root);return;}
if(!ch[root][0]&&!ch[root][1])root=0;
else if(!ch[root][0])root=ch[root][1],f[root]=0;
else if(!ch[root][1])root=ch[root][0],f[root]=0;
else{
p=ch[root][0];
while(ch[p][1])p=ch[p][1];
splay(p,ch[root][0]);
ch[p][1]=ch[root][1];f[ch[p][1]]=p,f[p]=0;pushup(p);
root=p;
}
}
int main(){
int N;scanf("%d",&N);
for(int i=1;i<=N;++i)
{
int opt,x;scanf("%d%d",&opt,&x);
if(opt==1)insert_x(x);
if(opt==2)delete_x(x);
if(opt==3)printf("%d\n",x_rank(x));
if(opt==4)printf("%d\n",rank_x(x));
if(opt==5)printf("%d\n",pre_x(x));
if(opt==6)printf("%d\n",aft_x(x));
}
return 0;
}

  

普通平衡树 Splay的更多相关文章

  1. hiho #1329 : 平衡树·Splay

    #1329 : 平衡树·Splay 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,上一次你跟我讲了Treap,我也实现了.但是我遇到了一个关键的问题. ...

  2. 【BZOJ3224】Tyvj 1728 普通平衡树 Splay

    Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数 ...

  3. BZOJ3224/洛谷P3391 - 普通平衡树(Splay)

    BZOJ链接 洛谷链接 题意简述 模板题啦~ 代码 //普通平衡树(Splay) #include <cstdio> int const N=1e5+10; int rt,ndCnt; i ...

  4. Hihocoder 1329 平衡树·Splay(平衡树)

    Hihocoder 1329 平衡树·Splay(平衡树) Description 小Ho:小Hi,上一次你跟我讲了Treap,我也实现了.但是我遇到了一个关键的问题. 小Hi:怎么了? 小Ho:小H ...

  5. 【阶梯报告】洛谷P3391【模板】文艺平衡树 splay

    [阶梯报告]洛谷P3391[模板]文艺平衡树 splay 题目链接在这里[链接](https://www.luogu.org/problemnew/show/P3391)最近在学习splay,终于做对 ...

  6. luoguP3391[模板]文艺平衡树(Splay) 题解

    链接一下题目:luoguP3391[模板]文艺平衡树(Splay) 平衡树解析 这里的Splay维护的显然不再是权值排序 现在按照的是序列中的编号排序(不过在这道题目里面就是权值诶...) 那么,继续 ...

  7. 平衡树——splay 三

    前文链接: 平衡树--splay 一 - yi_fan0305 - 博客园 (cnblogs.com) 平衡树--splay 二 - yi_fan0305 - 博客园 (cnblogs.com) 再补 ...

  8. 平衡树——splay 二

    上文传送门:平衡树--splay 一 - yi_fan0305 - 博客园 (cnblogs.com) OK,我们继续上文,来讲一些其他操作. 七.找排名为k的数 和treap的操作很像,都是通过比较 ...

  9. 平衡树——splay 一

    splay 一种平衡树,同时也是二叉排序树,与treap不同,它不需要维护堆的性质,它由Daniel Sleator和Robert Tarjan(没错,tarjan,又是他)创造,伸展树是一种自调整二 ...

  10. BZOJ3223: Tyvj 1729 文艺平衡树 [splay]

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3595  Solved: 2029[Submit][Sta ...

随机推荐

  1. UOJ #277 BZOJ 4739 定向越野 (计算几何、最短路)

    手动博客搬家: 本文发表于20181208 14:39:01, 原地址https://blog.csdn.net/suncongbo/article/details/84891710 哇它居然显示出图 ...

  2. linux下的mongodb数据库原生操作

    mongodb,是一种结构最像mysql的nosql mysql中的数据库,mongodb中也有,区别在于, myql中数据库下的是表,字段和数据的形式存在 mongodb数据库下的是叫集合(和pyt ...

  3. 【[Offer收割]编程练习赛10 B】出勤记录II

    [题目链接]:http://hihocoder.com/problemset/problem/1482 [题意] [题解] 递推题. 每次增加3个字符中的一个;然后根据下面这个数组递推; 递推方式看程 ...

  4. 用JMeter作WebService接口功能测试(可以借助SoapUI来完成)

    SoapUI里面的操作: Wsdl文件或链接导入或添加到SoapUI打开待测请求:运行请求:取URL  SOAPAction .报文. JMeter里面的操作: 为线程组添加SOAP/XML-RPC ...

  5. MySQL主要命令(4)

    显示数据, 给列区别名: select coL_name as 别名     from table_name;

  6. 【ACM】nyoj_139_我排第几个_201308062046

    我排第几个时间限制:1000 ms  |  内存限制:65535 KB 难度:3描述 现在有"abcdefghijkl”12个字符,将其所有的排列中按字典序排列,给出任意一种排列,说出这个排 ...

  7. Sublime Text 3常用插件—Emmet

    原文链接:http://www.cnblogs.com/easy-blue/p/6617852.html 摘要: 安装请看上一篇Sublime Text—安装,和sublime自带快捷键一起用,写ht ...

  8. Cloud Card是否能干掉App

    算下来有一年没写blog了.这一年算是潜心做一件事情,随着云OS 3.0已公布.总算能够向外界表达了我们想做个啥,非常多人也開始质疑,Cloud Card究竟是个啥?云OS 3.0算不算自主研发的OS ...

  9. 二维数组+字符串split+Double包装类 例题

    将String s = "1,2;3,4,5;6,7,8" 存放在double类型的二维数组中,使得 d[0][0]=1.0 d[0][1]=2.0 d[1][0]=3.0 d[1 ...

  10. 解题报告 之 HDU5303 Delicious Apples

    解题报告 之 HDU5303 Delicious Apples Description There are n apple trees planted along a cyclic road, whi ...