平衡树
Posted bakacirno
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了平衡树相关的知识,希望对你有一定的参考价值。
新学了无旋 treap,感觉特别好用,贴个模板在这里,之后再来补一下理解和注释。
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #define MAXN 100010 using namespace std; int n; struct FhqTree{ int L[MAXN],R[MAXN],val[MAXN],key[MAXN],siz[MAXN]; int cnt,root; int newnode(int data){ val[++cnt]=data; key[cnt]=rand(); siz[cnt]=1; return cnt; } void update(int now){ siz[now]=siz[L[now]]+siz[R[now]]+1; } void split(int now,int data,int &x,int &y){ if(!now) x=y=0; else{ if(val[now]<=data){ x=now; split(R[now],data,R[now],y); } else{ y=now; split(L[now],data,x,L[now]); } update(now); } } int merge(int x,int y){ if(!x||!y) return x+y; if(key[x]>key[y]){ R[x]=merge(R[x],y); update(x); return x; } else{ L[y]=merge(x,L[y]); update(y); return y; } } int x,y,z; void insert(int data){ split(root,data,x,y); root=merge(merge(x,newnode(data)),y); } void erease(int data){ split(root,data,x,z); split(x,data-1,x,y); y=merge(L[y],R[y]); root=merge(merge(x,y),z); } void getrank(int data){ split(root,data-1,x,y); printf("%d ",siz[x]+1); root=merge(x,y); } void getnum(int rank){ int now=root; while(now){ if(siz[L[now]]+1==rank) break; else if(siz[L[now]]>=rank) now=L[now]; else rank-=siz[L[now]]+1,now=R[now]; } printf("%d ",val[now]); } void pre(int data){ split(root,data-1,x,y); int now=x; while(R[now]) now=R[now]; printf("%d ",val[now]); root=merge(x,y); } void nxt(int data){ split(root,data,x,y); int now=y; while(L[now]) now=L[now]; printf("%d ",val[now]); root=merge(x,y); } }fhq; int main(){ srand(time(0)); scanf("%d",&n); int opt,x; while(n--){ scanf("%d%d",&opt,&x); if(opt==1) fhq.insert(x); else if(opt==2) fhq.erease(x); else if(opt==3) fhq.getrank(x); else if(opt==4) fhq.getnum(x); else if(opt==5) fhq.pre(x); else if(opt==6) fhq.nxt(x); } return 0; }
以上是关于平衡树的主要内容,如果未能解决你的问题,请参考以下文章