[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.