bzoj3224 Tyvj 1728 普通平衡树 treap
来源:互联网 发布:mac alias 配置 编辑:程序博客网 时间:2024/04/29 04:28
模板题啦~,复习一波。
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[N];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;}
阅读全文
0 0
- [BZOJ3224]Tyvj 1728 普通平衡树 && treap
- bzoj3224 Tyvj 1728 普通平衡树 treap
- 【模板】【bzoj3224】Tyvj 1728 普通平衡树 Treap
- bzoj3224 Tyvj 1728 普通平衡树 非旋转式Treap
- BZOJ3224[Tyvj 1728 普通平衡树]题解--Treap
- BZOJ3224 [Tyvj 1728] [普通平衡树] Treap的基本操作
- bzoj3224 Tyvj 1728 普通平衡树(splay/treap)
- [Bzoj3224]Tyvj 1728 普通平衡树
- [BZOJ3224]Tyvj 1728 普通平衡树
- 【bzoj3224】Tyvj 1728 普通平衡树
- [BZOJ3224] Tyvj 1728 普通平衡树
- 【bzoj3224】Tyvj 1728 普通平衡树
- 【BZOJ3224】Tyvj 1728 普通平衡树
- bzoj3224: Tyvj 1728 普通平衡树
- bzoj3224 Tyvj 1728 普通平衡树
- 【BZOJ3224】 Tyvj 1728 普通平衡树
- 【bzoj3224】Tyvj 1728 普通平衡树
- 【bzoj3224】Tyvj 1728 普通平衡树
- 物联网安全专家齐聚ICA联盟 多项IoT身份认证安全标准出炉
- BFC块级格式上下文
- Hibernate之Session的方法get()与load()的区别
- 3379数据结构实验之查找七:线性之哈希表
- 堆区、栈区、全局区、代码区
- bzoj3224 Tyvj 1728 普通平衡树 treap
- python里怎么样import带“-”文件名称的模块
- Python Flask Web 开发(1)
- 查找命令(5)——which
- Redis sentinel 安装使用及简单操作
- groovy的理解
- android定位和地图开发实例
- hdu 3727 Jewel(主席树)
- day1 基本数据类型