模板_Treap
2016-02-02 15:13
351 查看
传送门
#include<cstdio> #include<cstdlib> #include<iostream> using namespace std; struct Node{ Node *ch[2];//左右子树 int r,v,s; //随机优先值,值,节点总数 Node(int v):v(v){ch[0]=ch[1]=NULL;r=rand();s=1;} bool operator < (const Node &a) const{return r<a.r;} int comp(int x) const{if(x==v) return -1;return x<v?0:1;} void maintain(){s=1;if(ch[0]!=NULL) s+=ch[0]->s;if(ch[1]!=NULL) s+=ch[1]->s;} }; void rotate(Node* &o,int d){//旋转 d=0左旋 d=1右旋 Node* k=o->ch[d^1];o->ch[d^1]=k->ch[d];k->ch[d]=o; o->maintain();k->maintain();o=k; } void insert(Node* &o,int x){//插入x if(o==NULL) o=new Node(x); else{ int d=(x<o->v?0:1); insert(o->ch[d],x); if(o->ch[d]->r > o->r) rotate(o,d^1); } o->maintain(); } void remove(Node* &o,int x){//删除节点 int d=o->comp(x); if(d==-1){ Node* u=o; if(o->ch[0]!=NULL&&o->ch[1]!=NULL){ int d2=(o->ch[0]->r > o->ch[1]->r?1:0); rotate(o,d2);remove(o->ch[d2],x); }else{ if(o->ch[0]==NULL) o=o->ch[1];else o=o->ch[0]; delete u; } }else remove(o->ch[d],x); if(o!=NULL) o->maintain(); } int kth(Node* o,int k){//第k大 if(o==NULL||k<=0||k>o->s) return 0; int s=(o->ch[1]==NULL?0:o->ch[1]->s); if(k==s+1) return o->v; else if(k<=s) return kth(o->ch[1],k); else return kth(o->ch[0],k-s-1); }
相关文章推荐
- Linux编程中的中断信号和一些标识(sig uid gid pid)
- Android学习笔记-Android初级 (三)android内存管理技巧
- BZOJ1500维修数列Splay
- 大数据:“人工特征工程+线性模型”的尽头
- Cocos2d-x shader学习1: 灰度shader
- [转]Word2013发布博客到博客园的详细方法
- 无缝隙滚动
- 《数据库索引设计优化》读书笔记(四)
- MySQL数据库密码重置
- Android SDK Manager设置代理服务器和端口
- 文本自由选择
- 对于CV&MV的思考
- HTML string对象的操作
- uva11464 - Age Sort
- 安全测试之使用含有已知漏洞的组件
- 从 0 到 1:微信后台系统的演进之路
- 自己定义android 4.0以上的对话框风格
- 计算机网络原理笔记(三、数据链路层)
- 详解C#中的泛型以及编程中使用泛型的优点
- Python成长之路第一篇(3)_初识字典