您的位置:首页 > 其它

【BZOJ1208】宠物收养所(splay)

2017-01-06 20:16 387 查看

题意:见题面

思路:因为每个时刻要么全是人要么全是宠物,所以可以一棵splay解决

维护单点插入,单点删除,求前驱,求后继即可

1 var t:array[0..100000,0..1]of longint;
2     num,fa:array[0..100000]of longint;
3     n,cnt,t1,t2,i,root,p,x,y:longint;
4     ans:int64;
5
6 procedure rotate(x:longint;var k:longint);
7 var y,z,l,r:longint;
8 begin
9  y:=fa[x]; z:=fa[y];
10  if t[y,0]=x then l:=0
11   else l:=1;
12  r:=1-l;
13  if y=k then k:=x
14   else
15    if t[z,0]=y then t[z,0]:=x
16     else t[z,1]:=x;
17  fa[x]:=z; fa[y]:=x; fa[t[x,r]]:=y;
18  t[y,l]:=t[x,r]; t[x,r]:=y;
19 end;
20
21 procedure splay(x:longint;var k:longint);
22 var y,z:longint;
23 begin
24  while x<>k do
25  begin
26   y:=fa[x]; z:=fa[y];
27   if y<>k then
28   begin
29    if (t[y,0]=x)xor(t[z,0]=y) then rotate(x,k)
30     else rotate(y,k);
31   end;
32   rotate(x,k);
33  end;
34 end;
35
36 procedure ins(var k:longint;x,last:longint);
37 begin
38  if k=0 then
39  begin
40   inc(cnt);
41   k:=cnt; num[k]:=x;
42   fa[k]:=last; splay(k,root);
43   exit;
44  end;
45  if x<num[k] then ins(t[k,0],x,k)
46   else ins(t[k,1],x,k);
47 end;
48
49 procedure del(x:longint);
50 var k:longint;
51 begin
52  splay(x,root);
53  if t[x,0]*t[x,1]=0 then root:=t[x,0]+t[x,1]
54   else
55   begin
56    k:=t[x,1];
57    while t[k,0]>0 do k:=t[k,0];
58    t[k,0]:=t[x,0]; fa[t[x,0]]:=k;
59    root:=t[x,1];
60   end;
61  fa[root]:=0;
62 end;
63
64 procedure pred(k,x:longint);
65 begin
66  if k=0 then exit;
67  if num[k]<=x then
68  begin
69   t1:=k; pred(t[k,1],x);
70  end
71   else pred(t[k,0],x);
72 end;
73
74 procedure succ(k,x:longint);
75 begin
76  if k=0 then exit;
77  if num[k]>=x then
78  begin
79   t2:=k; succ(t[k,0],x);
80  end
81   else succ(t[k,1],x);
82 end;
83
84 begin
85  assign(input,'bzoj1208.in'); reset(input);
86  assign(output,'bzoj1208.out'); rewrite(output);
87  readln(n);
88  for i:=1 to n do
89  begin
90   readln(x,y);
91   if root=0 then begin p:=x; ins(root,y,0); end
92    else if p=x then ins(root,y,0)
93     else
94     begin
95      t1:=-1; t2:=-1;
96      pred(root,y); succ(root,y);
97      if t1=-1 then
98      begin
99       ans:=ans+num[t2]-y; ans:=ans mod 1000000; del(t2);
100      end
101       else if t2=-1 then
102       begin
103        ans:=ans+y-num[t1]; ans:=ans mod 1000000; del(t1);
104       end
105        else
106         if y-num[t1]>num[t2]-y then
107         begin
108          ans:=ans+num[t2]-y; ans:=ans mod 1000000; del(t2);
109         end
110          else
111          begin
112           ans:=ans+y-num[t1]; ans:=ans mod 1000000; del(t1);
113          end;
114     end;
115  end;
116  writeln(ans);
117  close(input);
118  close(output);
119 end.

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: