1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 int n,size,rt,kind,t1,t2;
 5 long long ans;
 6 int tr[80001][2],num[80001],fa[80001];
 7 void rotate(int x,int &k)
 8 {
 9     int y=fa[x],z=fa[y],l,r;
10     if(tr[y][0]==x)l=0;else l=1;r=l^1;
11     if(y==k)k=x;
12     else{if(tr[z][0]==y)tr[z][0]=x;else tr[z][1]=x;}
13     fa[x]=z;fa[y]=x;fa[tr[x][r]]=y;
14     tr[y][l]=tr[x][r];tr[x][r]=y;
15 }
16 void splay(int x,int &k)
17 {
18     int y,z;
19     while(x!=k)
20     {
21         y=fa[x],z=fa[y];
22         if(y!=k)
23         {
24             if((tr[y][0]==x)^(tr[z][0]==y))rotate(x,k);
25             else rotate(y,k);
26         }
27         rotate(x,k);
28     }
29 }
30 void ins(int &k,int x,int last)
31 {
32     if(k==0){size++;k=size;num[k]=x;fa[k]=last;splay(k,rt);return;}
33     if(x<num[k])ins(tr[k][0],x,k);else ins(tr[k][1],x,k);
34 }
35 void del(int x)
36 {
37     splay(x,rt);
38     if(tr[x][0]*tr[x][1]==0)
39     {rt=tr[x][0]+tr[x][1];}
40     else
41     {
42         int k=tr[x][1];
43         while(tr[k][0])k=tr[k][0];
44         tr[k][0]=tr[x][0];fa[tr[x][0]]=k;
45         rt=tr[x][1];
46     }
47     fa[rt]=0;
48 }
49 void ask_before(int k,int x)
50 {
51     if(k==0)return;
52     if(num[k]<=x){t1=k;ask_before(tr[k][1],x);}
53     else ask_before(tr[k][0],x);
54 }
55 void ask_after(int k,int x)
56 {
57     if(k==0)return;
58     if(num[k]>=x){t2=k;ask_after(tr[k][0],x);}
59     else ask_after(tr[k][1],x);
60 }
61   
62 int main()
63 {
64     scanf("%d",&n);
65     int f,x;
66     for(int i=1;i<=n;i++)
67     {
68         scanf("%d%d",&f,&x);
69         if(!rt){kind=f;}
70         if(kind==f){ins(rt,x,0);
71           }
72         else
73         {
74             t1=t2=-1;
75             ask_before(rt,x);ask_after(rt,x);
76             if(t1==-1){ans+=num[t2]-x;ans%=1000000;del(t2);}
77             else if(t2==-1){ans+=x-num[t1];ans%=1000000;del(t1);}
78             else
79             {
80                 if(x-num[t1]>num[t2]-x)  {ans+=num[t2]-x;ans%=1000000;del(t2);}
81                 else{ans+=x-num[t1];ans%=1000000;del(t1);}
82             }
83         }   
84     }
85     cout<<ans<<endl;
86     return 0;
87 }
88 

平衡树,当宠物多时,将宠物加入平衡树中,当读入一个收养者时,找收养者值的前驱和后继,并把接近的删除。收养者多是也这样。

posted on 2016-03-04 22:21  xiyuedong  阅读(177)  评论(0编辑  收藏  举报