【算法】Treap模版
#include<stdio.h> #include<stdlib.h> struct node{ int x,w,h,r,l; }; struct node a[10001]; int e; void rotate_left(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 rotate_right(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 insert(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) rotate_left(p,a[p].h); else rotate_right(p,a[p].h); } }else insert(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) rotate_left(p,a[p].h); else rotate_right(p,a[p].h); } }else insert(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(3221); a[1].x=k;e=1; a[1].w=rand(); for(i=2;i<=n;i++){ scanf("%d",&k); insert(root,k); } out(1); system("pause"); return 0; }
请勿随意转载

浙公网安备 33010602011771号