bzoj3224 Tyvj 1728 普通平衡树 treap
2017-08-29 16:27
387 查看
模板题啦~,复习一波。
treap比splay好写多了qwq
treap比splay好写多了qwq
#include<cstdio> #include<algorithm> #include<cstring> #include<cstdlib> #include<iostream> #define fo(i,a,b) for(int i=a;i<=b;i++) #define fd(i,a,b) for(int i=a;i>=b;i--) using namespace std; const int N=1e5+5; struct node { int l,r,v,size,rnd,w; } tr ; int n,size,root,ans; inline void update(int k) { tr[k].size=tr[tr[k].l].size+tr[tr[k].r].size+tr[k].w; } inline void rturn(int &k) { int t=tr[k].l;tr[k].l=tr[t].r;tr[t].r=k; tr[t].size=tr[k].size;update(k);k=t; } inline void lturn(int &k) { int t=tr[k].r;tr[k].r=tr[t].l;tr[t].l=k; tr[t].size=tr[k].size;update(k);k=t; } inline void insert(int &k,int x) { if (!k) { size++;k=size; tr[k].size=tr[k].w=1; tr[k].v=x; tr[k].rnd=rand(); return; } tr[k].size++; if (tr[k].v==x)tr[k].w++; else if (x>tr[k].v) { insert(tr[k].r,x); if (tr[tr[k].r].rnd<tr[k].rnd)lturn(k); } else { insert(tr[k].l,x); if (tr[tr[k].l].rnd<tr[k].rnd)rturn(k); } } inline void del(int &k,int x) { if (!k)return; if (tr[k].v==x) { if (tr[k].w>1) { tr[k].w--; tr[k].size--; return; } if (tr[k].l*tr[k].r==0)k=tr[k].l+tr[k].r; else if (tr[tr[k].l].rnd<tr[tr[k].r].rnd) rturn(k),del(k,x); else lturn(k),del(k,x); } else if(x>tr[k].v) tr[k].size--,del(tr[k].r,x); else tr[k].size--,del(tr[k].l,x); } int query_rank(int k,int x) { if(k==0)return 0; if(tr[k].v==x)return tr[tr[k].l].size+1; else if(x>tr[k].v) return tr[tr[k].l].size+tr[k].w+query_rank(tr[k].r,x); else return query_rank(tr[k].l,x); } int query_num(int k,int x) { if(k==0)return 0; if(x<=tr[tr[k].l].size) return query_num(tr[k].l,x); else if(x>tr[tr[k].l].size+tr[k].w) return query_num(tr[k].r,x-tr[tr[k].l].size-tr[k].w); else return tr[k].v; } void query_pro(int k,int x) { if(k==0)return; if(tr[k].v<x) { ans=k;query_pro(tr[k].r,x); } else query_pro(tr[k].l,x); } void query_sub(int k,int x) { if(k==0)return; if(tr[k].v>x) { ans=k;query_sub(tr[k].l,x); } else query_sub(tr[k].r,x); } int main() { scanf("%d",&n); int opt,x; for(int i=1;i<=n;i++) { scanf("%d%d",&opt,&x); switch(opt) { case 1:insert(root,x);break; case 2:del(root,x);break; case 3:printf("%d\n",query_rank(root,x));break; case 4:printf("%d\n",query_num(root,x));break; case 5:ans=0;query_pro(root,x);printf("%d\n",tr[ans].v);break; case 6:ans=0;query_sub(root,x);printf("%d\n",tr[ans].v);break; } } return 0; }
相关文章推荐
- BZOJ 3224 Tyvj 1728 普通平衡树——treap
- bzoj3224 Tyvj 1728 普通平衡树(splay/treap)
- 【模板】【bzoj3224】Tyvj 1728 普通平衡树 Treap
- 【treap】【bzoj 3224】: Tyvj 1728 普通平衡树
- Treap模板 BZOJ 3224: Tyvj 1728 普通平衡树
- 【bzoj3224】Tyvj 1728 普通平衡树 01Trie姿势+平衡树的四种姿势 :splay,旋转Treap,非旋转Treap,替罪羊树
- Treap树堆(bzoj 3224: Tyvj 1728 普通平衡树)
- [BZOJ3224]Tyvj 1728 普通平衡树 && treap
- 【Treap】[BZOJ 3224]Tyvj 1728 普通平衡树 & 非旋转实现
- bzoj3224Tyvj 1728 普通平衡树 treap
- BZOJ 3224: Tyvj 1728 普通平衡树 treap
- (treap)[bzoj3224][洛谷3369][cogs1829]Tyvj 1728 普通平衡树
- BZOJ 3224 TYVJ 1728 普通平衡树 [Treap树模板]
- bzoj 3224: Tyvj 1728 普通平衡树 treap
- bzoj3224 Tyvj 1728 普通平衡树 非旋转式Treap
- 【Treap】[BZOJ 3224]Tyvj 1728 普通平衡树
- BZOJ3224 Tyvj 1728 普通平衡树(Treap)
- BZOJ 3224 Tyvj 1728 普通平衡树 (Treap)
- BZOJ3224[Tyvj 1728 普通平衡树]题解--Treap
- BZOJ-3224 普通平衡树 TYVJ-1728 Treap + Vector