首页 > 代码库 > BZOJ3224 普通平衡树
BZOJ3224 普通平衡树
传送门:
treap模板题,当做treap模板
1 //OJ 1999 2 //by Cydiater 3 //2016.8.30 4 #include <iostream> 5 #include <cstdio> 6 #include <cstdlib> 7 #include <string> 8 #include <queue> 9 #include <map> 10 #include <ctime> 11 #include <cmath> 12 #include <algorithm> 13 #include <string> 14 #include <iomanip> 15 using namespace std; 16 #define ll long long 17 #define up(i,j,n) for(int i=j;i<=n;i++) 18 #define down(i,j,n) for(int i=j;i>=n;i--) 19 const int MAXN=1e5+5; 20 const int oo=0x3f3f3f3f; 21 inline ll read(){ 22 char ch=getchar();ll x=0,f=1; 23 while(ch>‘9‘||ch<‘0‘){if(ch==‘-‘)f=-1;ch=getchar();} 24 while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} 25 return x*f; 26 } 27 int N,op,num,root=0,tol=0,ans=0; 28 struct node{ 29 int leftt,rightt,v,cnt,rnd,siz; 30 }t[MAXN]; 31 namespace solution{ 32 void updata(int k){ 33 t[k].siz=t[t[k].leftt].siz+t[t[k].rightt].siz+t[k].cnt; 34 } 35 void lefturn(int &k){ 36 int tt=t[k].rightt;t[k].rightt=t[tt].leftt;t[tt].leftt=k; 37 t[tt].siz=t[k].siz;updata(k);k=tt; 38 } 39 void righturn(int &k){ 40 int tt=t[k].leftt;t[k].leftt=t[tt].rightt;t[tt].rightt=k; 41 t[tt].siz=t[k].siz;updata(k);k=tt; 42 } 43 void insert(int &k,int x){ 44 if(k==0){ 45 tol++;k=tol;t[k].siz=t[k].cnt=1; 46 t[k].v=x;t[k].rnd=rand(); 47 return; 48 } 49 t[k].siz++; 50 if(t[k].v==x) t[k].cnt++; 51 else if(x>t[k].v){ 52 insert(t[k].rightt,x); 53 if(t[t[k].rightt].rnd<t[k].rnd)lefturn(k); 54 }else{ 55 insert(t[k].leftt,x); 56 if(t[t[k].leftt].rnd<t[k].rnd)righturn(k); 57 } 58 } 59 void del(int &k,int x){ 60 if(k==0) return; 61 if(t[k].v==x){ 62 if(t[k].cnt>1){t[k].cnt--;t[k].siz--;return;} 63 if(t[k].leftt*t[k].rightt==0)k=t[k].leftt+t[k].rightt; 64 else if(t[t[k].leftt].rnd<t[t[k].rightt].rnd){ 65 righturn(k);del(k,x); 66 }else{ 67 lefturn(k);del(k,x); 68 } 69 }else if(x>t[k].v){ 70 t[k].siz--; 71 del(t[k].rightt,x); 72 }else{ 73 t[k].siz--; 74 del(t[k].leftt,x); 75 } 76 } 77 int query_rank(int k,int x){ 78 if(k==0)return 0; 79 if(t[k].v==x) return t[t[k].leftt].siz+1; 80 else if(x>t[k].v) return t[t[k].leftt].siz+t[k].cnt+query_rank(t[k].rightt,x); 81 else return query_rank(t[k].leftt,x); 82 } 83 int query_num(int k,int x){ 84 if(k==0) return 0; 85 if(x<=t[t[k].leftt].siz) return query_num(t[k].leftt,x); 86 else if(x>t[t[k].leftt].siz+t[k].cnt) return query_num(t[k].rightt,x-(t[t[k].leftt].siz+t[k].cnt)); 87 else return t[k].v; 88 } 89 void query_pre(int k,int x){ 90 if(k==0) return; 91 if(t[k].v<x){ 92 ans=t[k].v; 93 query_pre(t[k].rightt,x); 94 }else query_pre(t[k].leftt,x); 95 } 96 void query_nxt(int k,int x){ 97 if(k==0) return; 98 if(t[k].v>x){ 99 ans=t[k].v;100 query_nxt(t[k].leftt,x);101 }else query_nxt(t[k].rightt,x);102 }103 void slove(){104 N=read();105 up(i,1,N){106 op=read();num=read();107 if(op==1)insert(root,num);108 if(op==2)del(root,num);109 if(op==3)printf("%d\n",query_rank(root,num));110 if(op==4)printf("%d\n",query_num(root,num));111 if(op==5){112 query_pre(root,num);113 printf("%d\n",ans);114 }115 if(op==6){116 query_nxt(root,num);117 printf("%d\n",ans);118 }119 }120 }121 }122 int main(){123 //freopen("input.in","r",stdin);124 using namespace solution;125 slove(); 126 return 0;127 }
BZOJ3224 普通平衡树
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。