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 }

 

posted @ 2017-12-02 21:24  大奕哥&VANE  阅读(253)  评论(0编辑  收藏  举报