BZOJ1208 宠物收养所
裸treap,求前驱后继,这里使用了一个二维结构体。
1 #include<bits/stdc++.h> 2 using namespace std; 3 struct node 4 { 5 int l,r,size,rnd,v,w; 6 }t[2][100005]; 7 int rt1,rt2,cnt[2]; 8 void merge(int x,int k) 9 { 10 t[x][k].size=t[x][t[x][k].l].size+t[x][t[x][k].r].size+t[x][k].w; 11 } 12 void lturn(int x,int &k) 13 { 14 int rs=t[x][k].r; 15 t[x][k].r=t[x][rs].l; 16 t[x][rs].l=k; 17 t[x][rs].size=t[x][k].size; 18 merge(x,k); 19 k=rs; 20 } 21 void rturn(int x,int &k) 22 { 23 int ls=t[x][k].l; 24 t[x][k].l=t[x][ls].r; 25 t[x][ls].r=k; 26 t[x][ls].size=t[x][k].size; 27 merge(x,k); 28 k=ls; 29 } 30 void add(int x,int &k,int w) 31 { 32 if(!k) 33 { 34 k=++cnt[x]; 35 t[x][k].size=t[x][k].w=1; 36 t[x][k].v=w; 37 t[x][k].rnd=rand(); 38 return; 39 } 40 t[x][k].size++; 41 if(t[x][k].v==w)t[x][k].w++; 42 else if(t[x][k].v<w) 43 { 44 add(x,t[x][k].r,w); 45 if(t[x][t[x][k].r].rnd>t[x][k].rnd) 46 lturn(x,k); 47 } 48 else 49 { 50 add(x,t[x][k].l,w); 51 if(t[x][t[x][k].l].rnd>t[x][k].rnd) 52 rturn(x,k); 53 } 54 } 55 void del(int x,int &k,int w) 56 { 57 if(!k)return; 58 if(t[x][k].v==w) 59 { 60 if(t[x][k].w>1) 61 { 62 t[x][k].w--;t[x][k].size--; 63 } 64 else if(t[x][k].l*t[x][k].r==0)k=t[x][k].l+t[x][k].r; 65 else 66 { 67 if(t[x][t[x][k].l].rnd<t[x][t[x][k].r].rnd) 68 { 69 rturn(x,k); 70 del(x,k,w); 71 } 72 else 73 { 74 lturn(x,k); 75 del(x,k,w); 76 } 77 } 78 } 79 else 80 { 81 t[x][k].size--; 82 if(w>t[x][k].v)del(x,t[x][k].r,w); 83 else del(x,t[x][k].l,w); 84 } 85 } 86 int a,b; 87 int pre(int x,int k,int w) 88 { 89 if(!k)return -1e9; 90 if(t[x][k].v<=w) 91 { 92 return max(t[x][k].v,pre(x,t[x][k].r,w)); 93 } 94 else return pre(x,t[x][k].l,w); 95 } 96 int las(int x,int k,int w) 97 { 98 if(!k)return 1e9; 99 if(t[x][k].v>=w) 100 { 101 return min(t[x][k].v,las(x,t[x][k].l,w)); 102 } 103 else return las(x,t[x][k].r,w); 104 } 105 int main() 106 { 107 int n;int x,f; 108 scanf("%d",&n); 109 int ans=0; 110 for(int i=1;i<=n;++i) 111 { 112 scanf("%d%d",&f,&x); 113 if(!f) 114 { 115 if(t[1][rt1].size&&rt1) 116 { 117 int a=pre(1,rt1,x); 118 int b=las(1,rt1,x); 119 if(abs(x-a)<=abs(x-b)) 120 { 121 del(1,rt1,a); 122 ans+=abs(x-a);ans%=1000000; 123 } 124 else 125 { 126 del(1,rt1,b); 127 ans+=abs(x-b);ans%=1000000; 128 } 129 } 130 else 131 { 132 add(0,rt2,x); 133 } 134 } 135 else 136 { 137 if(t[0][rt2].size&&rt2) 138 { 139 int a=pre(0,rt2,x); 140 int b=las(0,rt2,x); 141 if(abs(x-a)<=abs(x-b)) 142 { 143 del(0,rt2,a); 144 ans+=abs(x-a);ans%=1000000; 145 } 146 else 147 { 148 del(0,rt2,b); 149 ans+=abs(x-b);ans%=1000000; 150 } 151 } 152 else 153 { 154 add(1,rt1,x); 155 } 156 } 157 } 158 printf("%d\n",ans); 159 return 0; 160 }
生命中真正重要的不是你遭遇了什么,而是你记住了哪些事,又是如何铭记的。