Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

3468 Splay差点超时,不过还是可以过的

Posted by Hoblovski at 2014-01-24 22:43:00 on Problem 3468 and last updated at 2014-01-27 20:37:15
虽然自己用普通线段树2s,ZKW线段树1s过了,为了学Splay还是写了Splay 4875ms过
(*        好像很多地方都可以优化,算了...        *)

蒟蒻代码->
( 由于不涉及Insert/Delete 所以查找节点直接用的值而不是size,这样会快一点 )
program poj3468;

type pnode=^tnode;
     tnode=record
        v,len,w:longint;
        sum,dlt:int64;
        p,l,r:pnode;
     end;

const maxn=100017;

var null,root,tp:pnode;
    n,cmd:longint;
    initial:array[0..maxn] of longint;

procedure splay_init;
begin
new(null);
with null^ do begin
        v:=0; len:=0; w:=0; dlt:=0; sum:=0;
        l:=null; r:=null; p:=null;
end;
root:=null;
end;

procedure pushupto(var i:pnode);
begin
i^.len:=i^.l^.len+i^.r^.len+1;
i^.sum:=i^.l^.sum+i^.l^.len*i^.l^.dlt
       +i^.r^.sum+i^.r^.len*i^.r^.dlt
       +i^.w;
end;

procedure pushdown(var i:pnode);
begin
if i^.dlt=0 then exit;
inc(i^.w,i^.dlt);
inc(i^.sum,i^.len*i^.dlt);
if i^.l<>null then inc(i^.l^.dlt,i^.dlt);
if i^.r<>null then inc(i^.r^.dlt,i^.dlt);
i^.dlt:=0;
end;

procedure build(var i:pnode;il,ir:longint);
var mid:longint;
begin
new(i); mid:=(il+ir)>>1;
i^.v:=mid;
i^.sum:=initial[mid]; i^.len:=ir-il+1;
i^.w:=initial[mid];   i^.dlt:=0;
if il<>ir then begin
        if il<=mid-1 then build(i^.l,il,mid-1) else i^.l:=null;
        if ir>=mid+1 then build(i^.r,mid+1,ir) else i^.r:=null;
        i^.l^.p:=i; i^.r^.p:=i;
        pushupto(i);
end else begin
        i^.l:=null; i^.r:=null;
end;
end;

procedure rrot(var i:pnode);
var lkid:pnode;
begin
pushdown(i); pushdown(i^.l);
lkid:=i^.l; i^.l:=lkid^.r; lkid^.r:=i;
lkid^.p:=i^.p; i^.p:=lkid; i^.l^.p:=i;
pushupto(i); pushupto(lkid);
if i=root then root:=lkid
else if lkid^.v<lkid^.p^.v then lkid^.p^.l:=lkid
else lkid^.p^.r:=lkid;
i:=lkid;
end;

procedure lrot(var i:pnode);
var rkid,tmp:pnode;
begin
pushdown(i); pushdown(i^.r);
rkid:=i^.r; i^.r:=rkid^.l; rkid^.l:=i;
rkid^.p:=i^.p; i^.p:=rkid; i^.r^.p:=i;
pushupto(i); pushupto(rkid);
if i=root then root:=rkid
else if rkid^.v<rkid^.p^.v then rkid^.p^.l:=rkid
else rkid^.p^.r:=rkid;
i:=rkid;
end;

procedure splay(var i,j:pnode);
var k:pnode;
begin
while i<>j do begin
        if i^.p=j then
                if i=j^.l then rrot(j)
                          else lrot(j)
        else if i=i^.p^.l then
                if i^.p=i^.p^.p^.l then begin
                        k:=i^.p^.p;     rrot(k);
                        k:=i^.p;        rrot(k);
                end else begin
                        k:=i^.p;        rrot(k);
                        k:=i^.p;        lrot(k);
                end
        else    if i^.p=i^.p^.p^.l then begin
                        k:=i^.p;        lrot(k);
                        k:=i^.p;        rrot(k);
                end else begin
                        k:=i^.p^.p;     lrot(k);
                        k:=i^.p;        lrot(k);

                end;
end;
end;

function getnode(i:longint):pnode;
begin
getnode:=root;
while (getnode<>null)and(getnode^.v<>i) do
        if i<getnode^.v then getnode:=getnode^.l else getnode:=getnode^.r;
end;

procedure init;
var i,j,k:longint;
begin
readln(n,cmd);
for i:=1 to n do read(initial[i]);
readln;
end;

procedure work;
var i,j,k:longint;
    op:char;
    tp:pnode;
begin
tp:=root;
while tp<>null do begin
        dec(tp^.len);
        tp:=tp^.l;
end;
tp:=root;
while tp<>null do begin
        dec(tp^.len);
        tp:=tp^.r;
end;
while cmd>0 do begin
        dec(cmd);
        read(op);
        case op of
                'Q':begin
                        readln(i,j);
                        tp:=getnode(i-1);       splay(tp,root);
                        tp:=getnode(j+1);       splay(tp,root^.r);
                        pushdown(root); pushdown(root^.r); pushdown(root^.r^.l);
                        writeln(root^.r^.l^.sum);
                end;
                'C':begin
                        readln(i,j,k);
                        tp:=getnode(i-1);       splay(tp,root);
                        tp:=getnode(j+1);       splay(tp,root^.r);
                        inc(root^.r^.l^.dlt,k);
                end;
        end;
end;
end;

begin
init;
splay_init;
build(root,0,n+1);
work;
end.

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator