【treap】【bzoj 3224】: Tyvj 1728 普通平衡树
来源:互联网 发布:速卖通数据分析 编辑:程序博客网 时间:2024/04/30 02:31
加上了前驱和后继
//#define _TEST _TEST#include <cstdio>#include <cstring>#include <cstdlib>#include <iostream>#include <cmath>#include <algorithm>using namespace std;/************************************************Code By willinglive Blog:http://willinglive.cf************************************************/#define rep(i,l,r) for(int i=l,___t=(r);i<=___t;i++)#define per(i,r,l) for(int i=r,___t=(l);i>=___t;i--)#define MS(arr,x) memset(arr,x,sizeof(arr))#define LL long long#define INE(i,u,e) for(int i=head[u];~i;i=e[i].next)#define LS T[o].l#define RS T[o].rinline const int getint(){ int r=0,k=1;char c=getchar(); for(;c<'0'||c>'9';c=getchar())if(c=='-')k=-1; for(;c>='0'&&c<='9';c=getchar())r=r*10+c-'0'; return k*r;}/////////////////////////////////////////////////int n,root,sz,ans;struct data{int l,r,s,cnt,rnd,w;}T[100001];/////////////////////////////////////////////////void update(int o){T[o].s=T[LS].s+T[RS].s+T[o].cnt;}void r_rot(int &o){int t=LS;LS=T[t].r;T[t].r=o;T[t].s=T[o].s;update(o);o=t;}void l_rot(int &o){int t=RS;RS=T[t].l;T[t].l=o;T[t].s=T[o].s;update(o);o=t;}void insert(int &o,int x){if(o==0){o=++sz;T[o].s=T[o].cnt=1;T[o].rnd=rand()*rand();T[o].w=x;return;}T[o].s++;if(x<T[o].w){insert(LS,x);if(T[o].rnd>T[LS].rnd) r_rot(o);}else if(x>T[o].w){insert(RS,x);if(T[o].rnd>T[RS].rnd) l_rot(o);}else T[o].cnt++;}void del(int &o,int x){if(o==0)return;if(T[o].w==x){if(T[o].cnt>1) T[o].s--,T[o].cnt--;else if(LS==0||RS==0)o=LS+RS;else if(T[LS].rnd<T[RS].rnd) r_rot(o),del(o,x);else l_rot(o),del(o,x);return;}T[o].s--;if(T[o].w<x) del(RS,x);else del(LS,x);}int getrank(int o,int x){if(o==0) return 0;if(T[o].w==x) return T[LS].s+1;else if(T[o].w<x) return T[LS].s+T[o].cnt+getrank(RS,x);else return getrank(LS,x);}int getnum(int o,int x){if(o==0) return 0;if(x<=T[LS].s) return getnum(LS,x);else if(x>T[LS].s+T[o].cnt) return getnum(RS,x-T[LS].s-T[o].cnt);else return T[o].w;}void getbefore(int o,int x){if(o==0) return;if(T[o].w<x) ans=T[o].w,getbefore(RS,x);else getbefore(LS,x);}void getafter(int o,int x){if(o==0) return;if(T[o].w>x) ans=T[o].w,getafter(LS,x);else getafter(RS,x);}/////////////////////////////////////////////////void input(){srand(13131); scanf("%d",&n);}void solve(){int op;int x; while(n--) { scanf("%d%d",&op,&x); if(op==1) insert(root,x); else if(op==2) del(root,x); else if(op==3) printf("%d\n",getrank(root,x)); else if(op==4) printf("%d\n",getnum(root,x)); else if(op==5) ans=0,getbefore(root,x),printf("%d\n",ans); else if(op==6) ans=0,getafter(root,x),printf("%d\n",ans); }}/////////////////////////////////////////////////int main(){ #ifndef _TEST freopen("std.in","r",stdin); freopen("std.out","w",stdout); #endif input(); solve(); return 0;}
0 0
- 【treap】【bzoj 3224】: Tyvj 1728 普通平衡树
- 【Treap】[BZOJ 3224]Tyvj 1728 普通平衡树
- bzoj 3224: Tyvj 1728 普通平衡树 treap
- bzoj 3224: Tyvj 1728 普通平衡树 Treap
- Treap模板 BZOJ 3224: Tyvj 1728 普通平衡树
- BZOJ 3224 Tyvj 1728 普通平衡树 (Treap)
- BZOJ 3224 Tyvj 1728 普通平衡树——treap
- BZOJ-3224 普通平衡树 TYVJ-1728 Treap + Vector
- Treap树堆(bzoj 3224: Tyvj 1728 普通平衡树)
- 【Treap】[BZOJ 3224]Tyvj 1728 普通平衡树 & 非旋转实现
- 3224: Tyvj 1728 普通平衡树 P3369 【模板】普通平衡树(Treap/SBT)Treap
- BZOJ 3224: 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 普通平衡树
- RHEL 6.4 安装 cx_Oracle
- Ubuntu 14.04 安装chrome 38.0
- Hibernate和iBATIS 优缺点比较
- 指针和引用的区别
- 2013年福建省赛ACM题目
- 【treap】【bzoj 3224】: Tyvj 1728 普通平衡树
- 在ecshop中如何实现对一个模板的添加?
- 营销不等于销售
- Linux命令学习(13) less命令
- 代码生成器原理(三)
- 《黑客免杀攻防》第八章 PE文件知识在免杀中的应用
- jaxp sax解析xml代码
- hibernate与ibatis比较的11大优势
- 壳