普通平衡树 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 ...
随机推荐
- Spring Boot-整合Mybatis(五)
原始的整合方式 1.添加依赖 <!--mybatis起步依赖--> <dependency> <groupId>org.mybatis.spring.boot< ...
- 洛谷 P2023 BZOJ 1798 [AHOI2009]维护序列
题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一 ...
- ACDream - Power Sum
先上题目: Power Sum Time Limit: 20000/10000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) S ...
- HDU - 2833 - WuKong
先上题目: WuKong Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- 实践一些js中的prototype, __proto__, constructor
<!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta http-equiv ...
- Shallow Heap 和 Retained Heap的区别
http://blog.csdn.net/a740169405/article/details/53610689 Shallow Heap 和 Retained Heap的区别 https://i.c ...
- Android ContextMenu的使用
ContextMenu介绍: 假设一个View注冊了上下文菜单.那么当长按该View时便会弹出一个浮动菜单,来供选择下一步操作. 实现这个功能须要调用setOnCreateContextMenuLis ...
- 介绍C++ STL常用模板使用方法的相关资料
1.vector的几种初始化及赋值方式
- HDU 5176
这道题以前好像在哪遇到过. 注意树的每一条边都是桥,所以,桥两端的点要到达对方是必须通过这条边的.于是,可以把边由小到大排序,利用并查集,这样,每加一条边就连通了一部分,而随着权值的增大,必定是桥两端 ...
- 一个表空间使用率查询sql的优化
话不多说,直接上运行计划: SQL> set lines 500; SQL> set pagesize 9999; SQL> set long 9999; SQL> selec ...