数据结构--文艺平衡树(Splay)
来源:互联网 发布:web编程入门经典 编辑:程序博客网 时间:2024/06/05 06:19
模板传送门
很久以前我就听说Splay很好写,也很实用,今天晚上抄了一个看起来不错的代码,发现的确挺好懂,也挺好写,不过就是有点儿长了,刚好150行。
我还没有怎么好好研究过,这几天打算研究研究,所以我也不讲原理了,自行百度吧。
代码:
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cstdlib>#include<cmath>#include<vector>#include<queue>#define ll long longusing namespace std;struct node{ int ch[2]; int fa; int cnt; int val; int son;}t[500001];int tot,root;void pushup(int rt){ t[rt].son=t[t[rt].ch[0]].son+t[t[rt].ch[1]].son+t[rt].cnt;}void rotate(int x){ int y=t[x].fa; int z=t[y].fa; int k=t[y].ch[1]==x; t[z].ch[t[z].ch[1]==y]=x; t[x].fa=z; t[y].ch[k]=t[x].ch[k^1]; t[t[x].ch[k^1]].fa=y; t[x].ch[k^1]=y; t[y].fa=x; pushup(y); pushup(x);}void splay(int x,int goal){ while(t[x].fa!=goal){ int y=t[x].fa; int z=t[y].fa; if(z!=goal){ (t[y].ch[1]==x)^(t[z].ch[1]==y)?rotate(x):rotate(y); } rotate(x); } if(goal==0){ root=x; }}void insert(int x){ int u=root; int fa=0; while(u&&x!=t[u].val){ fa=u; u=t[u].ch[x>t[u].val]; } if(u){ t[u].cnt++; } else{ u=++tot; if(fa){ t[fa].ch[x>t[fa].val]=u; } t[u].ch[0]=t[u].ch[1]=0; t[u].val=x; t[u].cnt=t[u].son=1; t[u].fa=fa; } splay(u,0);}void Find(int x){ int u=root; if(!u){ return; } while(t[u].ch[x>t[u].val]&&x!=t[u].val){ u=t[u].ch[x>t[u].val]; } splay(u,0);}int Next(int x,int f){ Find(x); int u=root; if((t[u].val<x&&!f)||(t[u].val>x&&f))return u; u=t[u].ch[f]; while(t[u].ch[f^1])u=t[u].ch[f^1]; return u;}void Delete(int x){ int a=Next(x,0); int b=Next(x,1); splay(a,0); splay(b,a); int del=t[b].ch[0]; if(t[del].cnt>1){ t[del].cnt--; splay(del,0); } else{ t[b].ch[0]=0; }}int Kth(int x){ int u=root; if(x>t[u].son){ return 0; } while(1){ int y=t[u].ch[0]; if(x>t[y].son+t[u].cnt){ x-=t[y].son+t[u].cnt; u=t[u].ch[1]; } else if(x<=t[y].son){ u=y; } else{ return t[u].val; } }}int main(){ insert(-2000000000); insert(2000000000); 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); } else if(opt==2){ Delete(x); } else if(opt==3){ Find(x); printf("%d\n",t[t[root].ch[0]].son); } else if(opt==4){ printf("%d\n",Kth(x+1)); } else if(opt==5){ printf("%d\n",t[Next(x,0)].val); } else if(opt==6){ printf("%d\n",t[Next(x,1)].val); } } return 0;}
阅读全文
1 0
- 数据结构--文艺平衡树(Splay)
- 数据结构入门6—文艺平衡树(Splay)
- BZOJ 3223 文艺平衡树 (splay)
- BZOJ3223 文艺平衡树(Splay)
- 文艺平衡树(splay旋转操作)
- 【模板】文艺平衡树(Splay)
- P3391 【模板】文艺平衡树(Splay)
- [BZOJ3223] 文艺平衡树 - splay
- [BZOJ3223]文艺平衡树 splay
- bzoj3223文艺平衡树splay
- [BZOJ3223]文艺平衡树(平衡树splay)
- [BZOJ3223]文艺平衡树(平衡树splay)
- 【splay】splay小结 文艺平衡树
- BZOJ3223&3224 文艺&普通平衡树 Splay模板(数组)
- [BZOJ 3223]Tyvj 1729 文艺平衡树(Splay)
- BZOJ3323 文艺平衡树 (splay 绿色无毒模板)
- 区间翻转 bzoj 3223 文艺平衡树 (splay)
- luogu #3391 【模板】文艺平衡树(splay)
- Spring内置任务调度实现添加、取消、重置
- gradle 创建多模块工程
- PCA algorithm原理及使用
- CrashHandler实现UncaughtExceptionHandler拦截android异常
- 九月十一日——ajax的基本书写
- 数据结构--文艺平衡树(Splay)
- seo优化基础知识:如何优化博客文章
- hdu6195(水)
- bzoj 4103: [Thu Summer Camp 2015]异或运算 可持久化trie
- linux挂载U盘
- 多表查询操作
- 浮点数定化--altera 乘除法ip使用FPGA学习笔记
- Opencv-滑动条的使用
- matlab 主成分分析函数(PC A)