TREAP平衡树

来源:互联网 发布:win10网络图标灰色 编辑:程序博客网 时间:2024/06/05 20:25
#include<cstdio>#include<stdlib.h>using namespace std;struct node{int x,w,h,r,l;};struct node a[10001];int e;void rl(int v,int u){int t=a[u].h;a[u].r=a[v].l;a[a[v].l].h=u;      a[u].h=v;a[v].l=u;      a[v].h=t;      if(a[t].l==u)a[t].l=v;      else a[t].r=v;   }void rr(int v,int u){      int t=a[u].h;      a[u].l=a[v].r;a[a[v].r].h=u;      a[u].h=v;a[v].r=u;      a[v].h=t;      if(a[t].l==u)a[t].l=v;      else a[t].r=v;    } void ins(int v,int u){      int p;      if(!v)return;      if(u>a[v].x){          if(!a[v].r){              a[++e].x=u;              a[e].w=rand();              a[e].h=v;              a[v].r=e;              p=e;              while(!a[p].h && a[p].w>a[a[p].h].w){                  if(p==a[a[p].h].r)                      rl(p,a[p].h);                  else    rr(p,a[p].h);              }                        }else ins(a[v].r,u);               }else{          if(!a[v].l){              a[++e].x=u;              a[e].w=rand();              a[e].h=v;              a[v].l=e;             p=e;              while(!a[p].h && a[p].w>a[a[p].h].w){                  if(p==a[a[p].h].r)                      rl(p,a[p].h);                  else    rr(p,a[p].h);              }          }else ins(a[v].l,u);       }  }  void out(int s){      if(!s)return;      out(a[s].l);      printf("%d ",a[s].x);      out(a[s].r);  }   int main(){      int i,j,k,m,n,root=1;      scanf("%d",&n);      scanf("%d",&k);      srand(2141);      a[1].x=k;e=1;      a[1].w=rand();      for(i=2;i<=n;i++){          scanf("%d",&k);          ins(root,k);      }      out(1);        return 0;  }  

1 0