【Treap】[CQBZOJ2803]普通平衡树
2015-11-18 22:21
288 查看
粘模板
[code]#include<cstdio> #include<algorithm> using namespace std; #define MAXN 500000 int n,pre,bk; struct node{ int val,pri,cnt,lsize,rsize; node *ls,*rs; }treap_tree[MAXN+10],*tcnt=treap_tree,*root; void Read(int &x){ char c; bool f=0; while(c=getchar(),c!=EOF){ if(c=='-') f=1; if(c>='0'&&c<='9'){ x=c-'0'; while(c=getchar(),c>='0'&&c<='9') x=x*10+c-'0'; if(f) x=-x; return; } } } void Rotate_left(node *&a){ node *b=a->rs; a->rs=b->ls; b->ls=a; a->rsize=b->lsize; b->lsize=a->lsize+a->rsize+a->cnt; a=b; } void Rotate_right(node *&a){ node *b=a->ls; a->ls=b->rs; b->rs=a; a->lsize=b->rsize; b->rsize=a->lsize+a->rsize+a->cnt; a=b; } void del(node *&p,int val){ if(p->val==val){ if(p->cnt>1){ p->cnt--; return; } if(!p->ls||!p->rs){ if(p->ls) p=p->ls; else p=p->rs; return; } if(p->ls->pri<p->rs->pri){ Rotate_right(p); p->rsize--; del(p->rs,val); } else{ Rotate_left(p); p->lsize--; del(p->ls,val); } } else if(val<p->val){ p->lsize--; del(p->ls,val); } else{ p->rsize--; del(p->rs,val); } } void Treap_insert(node *&p,int val){ if(!p){ p=++tcnt; p->cnt=1; p->val=val; p->ls=p->rs=NULL; p->pri=rand(); return; } if(val>p->val){ p->rsize++; Treap_insert(p->rs,val); if(p->rs->pri<p->pri) Rotate_left(p); } else if(val<p->val){ p->lsize++; Treap_insert(p->ls,val); if(p->ls->pri<p->pri) Rotate_right(p); } else p->cnt++; } int find_pos(node *&p,int val){ if(!p) return 0; if(p->val>val) return find_pos(p->ls,val); if(p->val<val) return p->lsize+p->cnt+find_pos(p->rs,val); return p->lsize; } void find_pre(node *&p,int val){ if(!p) return; if(p->val<val){ pre=p->val; find_pre(p->rs,val); } else find_pre(p->ls,val); } void find_bk(node *&p,int val){ if(!p) return; if(p->val>val) { bk=p->val; find_bk(p->ls,val); } else find_bk(p->rs,val); } void pos_find(node *&p,int pos){ if(pos<p->lsize) pos_find(p->ls,pos); else if(pos>=p->lsize+p->cnt) pos_find(p->rs,pos-p->lsize-p->cnt); else printf("%d\n",p->val); } int main() { int i,a,b; srand(2015111820); Read(n); for(i=1;i<=n;i++){ Read(a),Read(b); if(a==1) Treap_insert(root,b); else if(a==2) del(root,b); else if(a==3) printf("%d\n",find_pos(root,b)+1); else if(a==4) pos_find(root,b-1); else if(a==5){ find_pre(root,b); printf("%d\n",pre); } else{ find_bk(root,b); printf("%d\n",bk); } } }
相关文章推荐
- vector的resize()和reserve()函数的区别
- 装饰者模式——HeaderFirst学习笔记
- UITabBarController
- CSS3画图2
- 运行Java命令行报错 class not found
- 两个栈实现一个队列
- 数字三角形问题
- Android 自己画View -- drawable.draw 以及 drawText
- 日经春秋 20151118
- POJ 2253
- Struts2零碎点整理
- MySQL—记录的增删改查操作
- Struts2零碎点整理
- 天声人語 20151118 辺野古、「法廷闘争」へ
- 强大的STL之set
- java.lang.OutOfMemoryError: Java heap space
- Plus One【leetcode】【89】【E】
- 探秘C函数栈帧---实现自己的setjmp/longjmp
- [面试算法题]有序列表删除节点-leetcode学习之旅(4)
- 深入浅出Linux之内核数据结构