• 【BZOJ1208】宠物收养所(splay)


    题意:见题面

    思路:因为每个时刻要么全是人要么全是宠物,所以可以一棵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.
  • 相关阅读:
    oc-autorelease
    oc-循环引用问题
    oc-内存管理总结
    tomcat-各文件夹作用解析
    oc-多对象内存管理
    oc-arc(Automatic Reference Counting 自动引用机制) 与 内存管理
    tomcat-context.xml
    oc-set方法内存管理 和 @property的参数
    【转载】java学习线路
    一段shell脚本
  • 原文地址:https://www.cnblogs.com/myx12345/p/6257607.html
Copyright © 2020-2023  润新知