普通平衡树 Splay
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的更多相关文章
- hiho #1329 : 平衡树·Splay
#1329 : 平衡树·Splay 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,上一次你跟我讲了Treap,我也实现了.但是我遇到了一个关键的问题. ...
- 【BZOJ3224】Tyvj 1728 普通平衡树 Splay
Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数 ...
- BZOJ3224/洛谷P3391 - 普通平衡树(Splay)
BZOJ链接 洛谷链接 题意简述 模板题啦~ 代码 //普通平衡树(Splay) #include <cstdio> int const N=1e5+10; int rt,ndCnt; i ...
- Hihocoder 1329 平衡树·Splay(平衡树)
Hihocoder 1329 平衡树·Splay(平衡树) Description 小Ho:小Hi,上一次你跟我讲了Treap,我也实现了.但是我遇到了一个关键的问题. 小Hi:怎么了? 小Ho:小H ...
- 【阶梯报告】洛谷P3391【模板】文艺平衡树 splay
[阶梯报告]洛谷P3391[模板]文艺平衡树 splay 题目链接在这里[链接](https://www.luogu.org/problemnew/show/P3391)最近在学习splay,终于做对 ...
- luoguP3391[模板]文艺平衡树(Splay) 题解
链接一下题目:luoguP3391[模板]文艺平衡树(Splay) 平衡树解析 这里的Splay维护的显然不再是权值排序 现在按照的是序列中的编号排序(不过在这道题目里面就是权值诶...) 那么,继续 ...
- 平衡树——splay 三
前文链接: 平衡树--splay 一 - yi_fan0305 - 博客园 (cnblogs.com) 平衡树--splay 二 - yi_fan0305 - 博客园 (cnblogs.com) 再补 ...
- 平衡树——splay 二
上文传送门:平衡树--splay 一 - yi_fan0305 - 博客园 (cnblogs.com) OK,我们继续上文,来讲一些其他操作. 七.找排名为k的数 和treap的操作很像,都是通过比较 ...
- 平衡树——splay 一
splay 一种平衡树,同时也是二叉排序树,与treap不同,它不需要维护堆的性质,它由Daniel Sleator和Robert Tarjan(没错,tarjan,又是他)创造,伸展树是一种自调整二 ...
- BZOJ3223: Tyvj 1729 文艺平衡树 [splay]
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3595 Solved: 2029[Submit][Sta ...
随机推荐
- zuul 路由网关
一.阐述 Zuul 包含了对请求的路由和过滤两个主要的功能: 路由功能:负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础: 滤器功能:负责对请求的处理过程干预,是实现请求校验.服务 ...
- SQL Server 通过备份文件初始化复制 – 听风吹雨
一.背景 MySQL在对有历史数据的数据库进行搭建复制(Master/Slave)的时候,可以通过在Master服务器备份历史数据,利用这个备份文件 在Slave进行还原:这样做的好处是可以更加快速的 ...
- Ajax json 数据格式
ajax : 是么是同步 什么事异步 同步现象:客户端发送请求到服务端,当服务端返回响应之前,客户端都处于等待卡死状态. 异步现象:客户端发送请求到服务器端,无论服务器是否返回,客户端都可以随意做其他 ...
- POJ 1265
主要利用PICK定理与边点数上的GCD的关系求解. 三角形一条边上的所有整数点(包括顶点)可以首先将这条边移到(0, 0)->(x, y).这时,(x/gcd(x, y), y/gcd(x, y ...
- 多个线程运行结束之后主线程再执行CountDownLatch
多个线程运行结束之后主线程再执行CountDownLatch 学习了:http://blog.csdn.net/lvyuanj/article/details/50737123 这个要膜拜一下! h ...
- Codeforces Round #256 (Div. 2) B
B. Suffix Structures Bizon the Champion isn't just a bison. He also is a favorite of the "Bizon ...
- HDU 5063 Operation the Sequence(暴力)
HDU 5063 Operation the Sequence 题目链接 把操作存下来.因为仅仅有50个操作,所以每次把操作逆回去执行一遍,就能求出在原来的数列中的位置.输出就可以 代码: #incl ...
- JAVA 几种多线程的简单实例 Thread Runnable
实例1: class Hello extends Thread{ private String name; public Hello(){} public Hello(String name){ th ...
- 《从零開始学Swift》学习笔记(Day 56)—— Swift编码规范之命名规范
原创文章,欢迎转载.转载请注明:关东升的博客 程序代码中到处都是自定义的名字,取一个有样而且符合规范的名字非常重要. 命名方法非常多,可是比較有名的,广泛接受命名法有: 匈牙利命名,一般仅仅是命名变量 ...
- 2016.04.07,英语,《Vocabulary Builder》Unit 11
cant, from the Latin verbs canere and cantare, meaning 'sing'. by way of French, add an h to the roo ...