普通平衡树 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 ...
随机推荐
- 第三次组队赛 (DFS&BFS)
网站:CSUST 8月1日 先总结下,不得不说死的很惨,又是第三就不说了,一共7道题,AC了5道,但是有一个组三个人是做的个人赛,有两人AK了.......Orz,然后深搜还是大问题,宽搜倒是不急了. ...
- MS SQL 迁移数据库文件
MS SQL 数据库迁移文件,这里说的不是将数据库迁移到另外一台服务器,只是在服务器不同磁盘目录内做迁移.移动数据库文件的情况大致有下面一些: 1: 事先没有规划好,数据库文件或日志文件增长过快,导致 ...
- 暑假集训D13总结
考试 又炸掉了= = 本来看着题就一脸茫然,默默的打暴力骗分,然后就交了卷= = 重要的是,在本机跑的毫无障碍的T3程序竟然在评测机CE啊喂,35分就没了啊喂(这可是比我现在分还高= =) 内心几近崩 ...
- 《 javascript 设计模式与开发实践 》 ---发布-订阅模式 代码小问题
定义公共事件: 删除事件优化:
- 使用 Redis及其产品定位
实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的不断增加,和访问量的持续增长,我们遇到了很多问题: ...
- vs--bookmark用法
快捷键 Ctrl+K,K 增加/取消书签 Ctrl+K,P 导航到上一个书签 Ctrl+K,N 导航到下一个标签 Ctrl+K,L 取消所有书签
- HDU 5191
好端端的被HACK掉了...应该是在两端都要补W个0才对,之前只想到要在后面补足0,没想到前面也应该补足,因为前面即便存在0也可能使得移动的积木数最少.. T_T #include <iostr ...
- HDUOJ--4888--Redraw Beautiful Drawings【isap】网络流+判环
链接:http://acm.hdu.edu.cn/showproblem.php? pid=4888 题意:一个矩阵.限定每行行和.列和,每一个格子数字不超过k,问矩阵是否存在,如存在推断有单解还是多 ...
- 【入门篇】ANDROID开发之BUG专讲
话说诸葛亮是一个优秀的程序员,每个锦囊都是应对不同的case而编写的.可是优秀的程序员也敌只是更优秀的bug.六出祈山.七进中原,鞠躬尽瘁,死而后已的诸葛亮仅仅由于有一个错误的case-马谡,整个结构 ...
- 【cl】Unable to find executable for: taskkill
十二月 02, 2015 5:16:56 下午 org.openqa.selenium.os.ProcessUtils killWinProcess警告: Process refused to die ...