1. 程式人生 > >HNOI2004 寵物收養所 (平衡二叉樹)

HNOI2004 寵物收養所 (平衡二叉樹)

static 技術 typedef 鏈接 != onclick hid ins none

題目鏈接

平衡樹基礎題,用於測試各種平衡樹的性能(霧)

treap:

技術分享圖片
  1 #include<bits/stdc++.h>
  2 typedef long long ll;
  3 using namespace std;
  4 struct Treap {
  5     static const int N=1e5+10;
  6     int rnd() {static int seed=time(0)%0x7fffffff; return seed=seed*48271ll%0x7fffffff;}
  7     int ch[N][2],siz[N],val[N],fa[N],tot,rd[N];
8 int rel(int u) {return ch[fa[u]][1]==u;} 9 void init() {tot=fa[0]=ch[0][0]=ch[0][1]=siz[0]=val[0]=rd[0]=0;} 10 int newnode(int x) { 11 int u=++tot; 12 fa[u]=ch[u][0]=ch[u][1]=0; 13 siz[u]=1,val[u]=x,rd[u]=rnd(); 14 return u; 15 } 16 void pu(int
u) {siz[u]=siz[ch[u][0]]+siz[ch[u][1]]+1;} 17 void rot(int u) { 18 int v=fa[u],f=rel(u),ff=rel(v); 19 ch[v][f]=ch[u][f^1],fa[ch[v][f]]=v; 20 ch[u][f^1]=v,fa[u]=fa[v],fa[v]=u; 21 if(fa[u])ch[fa[u]][ff]=u; 22 pu(v),pu(u); 23 } 24 void ins(int
& rt,int u) { 25 if(!rt) {rt=u; return;} 26 int v; 27 for(v=rt; ch[v][val[u]>=val[v]]; v=ch[v][val[u]>=val[v]]); 28 ch[v][val[u]>=val[v]]=u,fa[u]=v; 29 for(; fa[u]&&rd[u]<rd[fa[u]]; rot(u)); 30 if(!fa[u])rt=u; 31 for(u=fa[u]; u; u=fa[u])pu(u); 32 } 33 void del(int& rt,int u) { 34 if(u==rt) { 35 if(!ch[u][1])rt=ch[u][0]; 36 else if(!ch[u][0])rt=ch[u][1]; 37 else rt=ch[u][rd[ch[u][0]]>=rd[ch[u][1]]]; 38 } 39 for(; ch[u][0]&&ch[u][1]; rot(ch[u][rd[ch[u][0]]>=rd[ch[u][1]]])); 40 int f=ch[u][0]?0:1; 41 if(fa[u])ch[fa[u]][rel(u)]=ch[u][f]; 42 if(ch[u][f])fa[ch[u][f]]=fa[u]; 43 for(u=fa[u]; u; u=fa[u])pu(u); 44 } 45 int kth(int u,int k) { 46 while(k!=siz[ch[u][0]]+1) { 47 if(k<siz[ch[u][0]]+1)u=ch[u][0]; 48 else k-=siz[ch[u][0]]+1,u=ch[u][1]; 49 } 50 return u; 51 } 52 int next(int u) { 53 if(ch[u][1]) { 54 for(u=ch[u][1]; ch[u][0]; u=ch[u][0]); 55 return u; 56 } else { 57 for(; fa[u]&&rel(u); u=fa[u]); 58 return fa[u]; 59 } 60 } 61 int prev(int u) { 62 if(ch[u][0]) { 63 for(u=ch[u][0]; ch[u][1]; u=ch[u][1]); 64 return u; 65 } else { 66 for(; fa[u]&&!rel(u); u=fa[u]); 67 return fa[u]; 68 } 69 } 70 int lb(int rt,int x) { 71 int v=0; 72 for(int u=rt; u; u=ch[u][x>val[u]])if(val[u]>=x)v=u; 73 return v; 74 } 75 int ub(int rt,int x) { 76 int v=0; 77 for(int u=rt; u; u=ch[u][x>=val[u]])if(val[u]>x)v=u; 78 return v; 79 } 80 void go() { 81 init(); 82 const int mod=1000000; 83 const int inf=0x3f3f3f3f; 84 int rt=0,cnt=0,m,ans=0; 85 ins(rt,newnode(inf)); 86 ins(rt,newnode(~inf)); 87 scanf("%d",&m); 88 while(m--) { 89 int f,x; 90 scanf("%d%d",&f,&x); 91 if(f==0) { 92 if(cnt<0) { 93 int r=lb(rt,x),l=prev(r); 94 if(abs(val[l]-x)<=abs(val[r]-x)) { 95 ans=(ans+abs(val[l]-x))%mod; 96 del(rt,l); 97 } else { 98 ans=(ans+abs(val[r]-x))%mod; 99 del(rt,r); 100 } 101 } else ins(rt,newnode(x)); 102 cnt++; 103 } else { 104 if(cnt>0) { 105 int r=lb(rt,x),l=prev(r); 106 if(abs(val[l]-x)<=abs(val[r]-x)) { 107 ans=(ans+abs(val[l]-x))%mod; 108 del(rt,l); 109 } else { 110 ans=(ans+abs(val[r]-x))%mod; 111 del(rt,r); 112 } 113 } else ins(rt,newnode(x)); 114 cnt--; 115 } 116 } 117 printf("%d\n",ans); 118 } 119 } treap; 120 121 int main() { 122 treap.go(); 123 return 0; 124 }
View Code

splay:

技術分享圖片
  1 #include<bits/stdc++.h>
  2 typedef long long ll;
  3 using namespace std;
  4 struct Splay {
  5     static const int N=1e5+10;
  6     int ch[N][2],siz[N],val[N],fa[N],tot;
  7     int rel(int u) {return ch[fa[u]][1]==u;}
  8     void init() {tot=fa[0]=ch[0][0]=ch[0][1]=siz[0]=val[0]=0;}
  9     int newnode(int x) {
 10         int u=++tot;
 11         fa[u]=ch[u][0]=ch[u][1]=0;
 12         siz[u]=1,val[u]=x;
 13         return u;
 14     }
 15     void pu(int u) {siz[u]=siz[ch[u][0]]+siz[ch[u][1]]+1;}
 16     void rot(int u) {
 17         int v=fa[u],f=rel(u),ff=rel(v);
 18         ch[v][f]=ch[u][f^1],fa[ch[v][f]]=v;
 19         ch[u][f^1]=v,fa[u]=fa[v],fa[v]=u;
 20         if(fa[u])ch[fa[u]][ff]=u;
 21         pu(v),pu(u);
 22     }
 23     void splay(int& rt,int u) {
 24         for(int v=fa[rt]; fa[u]!=v; rot(u))
 25             if(fa[fa[u]]!=v&&rel(fa[u])==rel(u))rot(fa[u]);
 26         rt=u;
 27     }
 28     void ins(int& rt,int u) {
 29         if(!rt) {rt=u; return;}
 30         int v;
 31         for(v=rt; ch[v][val[u]>=val[v]]; v=ch[v][val[u]>=val[v]]);
 32         ch[v][val[u]>=val[v]]=u,fa[u]=v;
 33         splay(rt,u);
 34     }
 35     void del(int& rt,int u) {
 36         splay(rt,u);
 37         if(!ch[u][1])rt=ch[u][0];
 38         else if(!ch[u][0])rt=ch[u][1];
 39         else {
 40             splay(ch[rt][1],kth(ch[rt][1],1));
 41             ch[ch[rt][1]][0]=ch[rt][0];
 42             rt=fa[ch[rt][0]]=ch[rt][1];
 43             pu(rt);
 44         }
 45         fa[rt]=0;
 46     }
 47     int kth(int u,int k) {
 48         while(k!=siz[ch[u][0]]+1) {
 49             if(k<siz[ch[u][0]]+1)u=ch[u][0];
 50             else k-=siz[ch[u][0]]+1,u=ch[u][1];
 51         }
 52         return u;
 53     }
 54     int next(int u) {
 55         if(ch[u][1]) {
 56             for(u=ch[u][1]; ch[u][0]; u=ch[u][0]);
 57             return u;
 58         } else {
 59             for(; fa[u]&&rel(u); u=fa[u]);
 60             return fa[u];
 61         }
 62     }
 63     int prev(int u) {
 64         if(ch[u][0]) {
 65             for(u=ch[u][0]; ch[u][1]; u=ch[u][1]);
 66             return u;
 67         } else {
 68             for(; fa[u]&&!rel(u); u=fa[u]);
 69             return fa[u];
 70         }
 71     }
 72     int lb(int rt,int x) {
 73         int v=0;
 74         for(int u=rt; u; u=ch[u][x>val[u]])if(val[u]>=x)v=u;
 75         return v;
 76     }
 77     int ub(int rt,int x) {
 78         int v=0;
 79         for(int u=rt; u; u=ch[u][x>=val[u]])if(val[u]>x)v=u;
 80         return v;
 81     }
 82     void go() {
 83         init();
 84         const int mod=1000000;
 85         const int inf=0x3f3f3f3f;
 86         int rt=0,cnt=0,m,ans=0;
 87         ins(rt,newnode(inf));
 88         ins(rt,newnode(~inf));
 89         scanf("%d",&m);
 90         while(m--) {
 91             int f,x;
 92             scanf("%d%d",&f,&x);
 93             if(f==0) {
 94                 if(cnt<0) {
 95                     int r=lb(rt,x),l=prev(r);
 96                     if(abs(val[l]-x)<=abs(val[r]-x)) {
 97                         ans=(ans+abs(val[l]-x))%mod;
 98                         del(rt,l);
 99                     } else {
100                         ans=(ans+abs(val[r]-x))%mod;
101                         del(rt,r);
102                     }
103                 } else ins(rt,newnode(x));
104                 cnt++;
105             } else {
106                 if(cnt>0) {
107                     int r=lb(rt,x),l=prev(r);
108                     if(abs(val[l]-x)<=abs(val[r]-x)) {
109                         ans=(ans+abs(val[l]-x))%mod;
110                         del(rt,l);
111                     } else {
112                         ans=(ans+abs(val[r]-x))%mod;
113                         del(rt,r);
114                     }
115                 } else ins(rt,newnode(x));
116                 cnt--;
117             }
118         }
119         printf("%d\n",ans);
120     }
121 } splay;
122 
123 int main() {
124     splay.go();
125     return 0;
126 }
View Code

HNOI2004 寵物收養所 (平衡二叉樹)