bzoj 3224 Tyvj 1728 普通平衡树
2017-10-25 11:54
405 查看
还是SPLAY啦
坚持每日一道SPLAY
明天开启网络流计划
平衡树的基本操作#include<bits/stdc++.h> using namespace std; int n,op,x; struct splay_node{ int val,siz,cnt; splay_node *fa,*son[2]; splay_node(int _val,splay_node *_fa) { val=_val;siz=cnt=1; fa=_fa;son[0]=son[1]=0; } bool dir() { return this==this->fa->son[1]; } bool cmp(int _val) { return _val>val; } }*rt=0; void maintain(splay_node * o) { o->siz=o->cnt; for(int i=0;i<2;i++) if(o->son[i]) o->siz+=o->son[i]->siz,o->son[i]->fa=o; } void rorate(splay_node * o) { splay_node * p = o->fa; int d=o->dir(); p->son[d]=o->son[d^1]; o->son[d^1]=p; o->fa=p->fa; if(p->fa) p->fa->son[p->dir()]=o; maintain(p),maintain(o); } void splay(splay_node * o,splay_node *t) { while(o->fa!=t) { splay_node * p = o->fa; if(p->fa==t) rorate(o); else if(p->dir()==o->dir()) rorate(p),rorate(o); else rorate(o),rorate(o); } if(!t) rt=o; } void insert(splay_node * &o,splay_node * fa,int val) { if(!o) { o=new splay_node(val,fa); splay(o,0); return ; } if(val>o->val) insert(o->son[1],o,val); else if(val<o->val) insert(o->son[0],o,val); else o->cnt++,o->siz++,splay(o,0); } splay_node * find(splay_node *o,int val) { if(!o) return o; if(val>o->val) return find(o->son[1],val); else if(val<o->val) return find(o->son[0],val); else return o; } int rank(int val) { splay_node * o =find(rt,val); splay(o,0); if(!o->son[0]) return 1; else return o->son[0]->siz+1; } void del(int val) { splay_node * o=find(rt,val); if(!o) return ; o->cnt--; o->siz--; splay(o,0); if(o->cnt) return ; if(!o->son[0]&&o->son[1]) rt=o->son[1],o->son[1]->fa=0; else if(!o->son[1]&&o->son[0]) rt=o->son[0],o->son[0]->fa=0; else if(!o->son[0]&&!o->son[1]) rt=0 ; else { o->son[0]->fa=0; splay_node * p=o->son[0]; while(p->son[1]) p=p->son[1]; splay(p,0); p->son[1]=o->son[1]; maintain(p); } } int ask(splay_node * o,int k) { if(!o->son[0]&&k<=o->cnt) return o->val; if(!o->son[0]) return ask(o->son[1],k-o->cnt); if(o->son[0]->siz>=k) return ask(o->son[0],k); if(o->son[0]->siz+o->cnt>=k) return o->val; return ask(o->son[1],k-o->son[0]->siz-o->cnt); } int xiaoyu(int val) { splay_node * o =rt; int res=0; while(o) { if(o->val>=val) o=o->son[0]; else res=o->val,o=o->son[1]; } return res; } int dayu(int val) { splay_node * o =rt; int res=0; while(o) { if(o->val<=val) o=o->son[1]; else res=o->val,o=o->son[0]; } return res; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d%d",&op,&x); if(op==1) insert(rt,0,x); else if(op==2) del(x); else if(op==3) printf("%d\n",rank(x)); else if(op==4) printf("%d\n",ask(rt,x)); else if(op==5) printf("%d\n",xiaoyu(x)); else printf("%d\n",dayu(x)); } } /* 20 1 964673 5 968705 4 1 3 964673 5 965257 1 915269 1 53283 3 964673 3 53283 3 53283 1 162641 5 973984 1 948119 2 915269 2 53283 6 959161 1 531821 1 967521 2 531821 1 343410 */
心得:
1. RE WA TLE 的如果LOJ上有,一定先在LOJ上去做,有数据哇!!!!
相关文章推荐
- BZOJ 3224 Tyvj 1728 普通平衡树
- bzoj 3224: Tyvj 1728 普通平衡树
- BZOJ 3224 TYVJ 1728 普通平衡树 [Treap树模板]
- BZOJ 3224: Tyvj 1728 普通平衡树 替罪羊树
- 【bzoj3224】Tyvj 1728 普通平衡树
- Treap模板 BZOJ 3224: Tyvj 1728 普通平衡树
- [bzoj 3224] Tyvj 1728 普通平衡树(Splay)
- [BZOJ3224]Tyvj 1728 普通平衡树 && 重写平衡树
- BZOJ 3224:Tyvj 1728 普通平衡树
- [替罪羊树 模板题] BZOJ 3224 Tyvj 1728 普通平衡树
- BZOJ 3224 TYVJ 1728 普通平衡树
- bzoj 3224: Tyvj 1728 普通平衡树
- BZOJ 3224: Tyvj 1728 普通平衡树
- BZOJ 题目3224: Tyvj 1728 普通平衡树(SBT有重)
- [bzoj3224][tyvj1728][普通平衡树] (pb_ds库自带红黑树)
- BZOJ3224[Tyvj 1728 普通平衡树]题解--Treap
- 【bzoj3224】Tyvj 1728 普通平衡树
- bzoj3224: Tyvj 1728 普通平衡树(打个splay暖暖手)
- BZOJ 3224 Tyvj 1728 普通平衡树
- BZOJ3224 Tyvj 1728 普通平衡树