zoukankan      html  css  js  c++  java
  • [HNOI2002]营业额统计splay重写

    SBT:http://www.cnblogs.com/htfy/archive/2012/05/10/2495052.html

    program calc;
    
    Type
     rec=record
       fa,lch,rch,w:longint;
     end;
     
    Var
     f:array[0..1000000] of rec;
     n,i,ans,h,top,o:longint;
    
    Procedure fopen;
      begin
      assign(input,'calc.in');
      assign(output,'calc.out');
      reset(input);
      rewrite(output);
    end;
    
    Procedure fclose;
      begin
      close(input);
      close(output);
    end;
    
    Function new:longint;inline;
      begin
      inc(top);
      exit(top);
    end;
    
    
    Function Add(p,O:longint):longint;
      begin
      if h=0 then
        begin
        h:=new;
        f[1].w:=o;
        exit(1);
      end;
      if o<=f[p].w then
        if f[p].lch<>0 then
          exit(Add(f[p].lch,o))
        else
          begin
          f[p].lch:=new;
          f[f[p].lch].fa:=p;
          f[f[p].lch].w:=o;
          exit(f[p].lch);
        end
      else
        if f[p].rch<>0 then
          exit(Add(f[p].rch,o))
        else
          begin
          f[p].rch:=new;
          f[f[p].rch].w:=o;
          f[f[p].rch].fa:=p;
          exit(f[p].rch);
        end;
    end;
    
    
    Procedure zig(P:longint);inline;
    var
     root:longint;
      begin
      root:=f[p].rch;
      if p<>h then if f[f[p].fa].lch=p then f[f[p].fa].lch:=root else f[f[p].fa].rch:=root else h:=root;
      f[root].fa:=f[p].fa;
      f[p].rch:=f[root].lch;
      f[f[p].rch].fa:=p;
      f[root].lch:=p;
      f[p].fa:=root;
    end;
    
    Procedure zag(P:longint);inline;
    var
     root:longint;
      begin
      root:=f[p].lch;
      if p<>h then if f[f[p].fa].lch=p then f[f[p].fa].lch:=root else f[f[p].fa].rch:=root else h:=root;
      f[root].fa:=f[p].fa;
      f[p].lch:=f[root].rch;
      f[f[p].lch].fa:=p;
      f[root].rch:=p;
      f[p].fa:=root;
    end;
    
    Procedure Splay(P:longint);
    var
     x,y,z:longint;
      begin
      x:=p;
      y:=f[x].fa;
      z:=f[y].fa;
      while f[x].fa<>0 do
        begin
        y:=f[x].fa;
        z:=f[y].fa;
        if z=0 then
          begin
          if f[y].lch=x then zag(y) else zig(y);
          exit;
        end;
        if (f[y].lch=x) and (f[z].lch=y) then
          begin
          zag(z);
          zag(y);
        end else
        if (f[y].rch=x) and (f[z].rch=y) then
          begin
          zig(z);
          zig(y);
        end else
        if (f[z].lch=y) and (f[y].rch=x) then
          begin
          zig(y);
          zag(z);
        end else
          begin
          zag(y);
          zig(z);
        end;
      end;
    end;
      
    
    Function find(p,o:longint):longint;
      begin
      //writeln('i=',i,' p=',p,' o=',o);
      if p=0 then exit(0);
      if f[p].w=o then exit(o);
      find:=maxlongint;
      if o<=f[p].w then
        if f[p].lch=0 then find:=f[p].w else find:=find(f[p].lch,o)
      else
        if f[p].rch=0 then find:=f[p].w else find:=find(f[p].rch,o);
      if abs(f[p].w-o)<abs(find-o) then find:=f[p].w;
    end;
      
    
      begin
      fopen;
      readln(n);
      top:=0;
      for i:=1 to n do
        begin
        if not eof then readln(o) else o:=0;
        // writeln(abs(find(h,o)-o));
        inc(ans,abs(find(h,o)-o));
        splay(Add(h,o));
      end;
      writeln(ans);
      fclose;
    end.
    
  • 相关阅读:
    3:Exchange2016图形化安装和无人值守安装
    hdu 3980 Paint Chain (sg)
    hdu 1850 Being a Good Boy in Spring Festival (Nim)
    zoj 2971 Give Me the Number
    hdu 1847 Good Luck in CET4 Everybody! (sg)
    hdu 1754 I hate it (线段树)
    poj 1704 Georgia ans Bob (StaircaseNim)
    hdu 1907 John (Nim变形)
    hdu 1536 SNim (sg)
    hdu 1166 敌兵布阵 (线段树)
  • 原文地址:https://www.cnblogs.com/htfy/p/2983480.html
Copyright © 2011-2022 走看看