| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:我也发一个Splay伸展树版本的,3204ms过的,貌似常数还算小,静态数组做的In Reply To:再给一个这个问题的伸展树版本吧,好像很搓。。。。5S多过的。。还是SBT强啊。。 Posted by:yzhw at 2009-09-26 14:12:01 非常感谢ls神牛的程序,我就是照着你的改的,把指针改成了数组模拟的了。呵呵
program PKU_2761_Feed_the_dogs;
const
maxN=1000000; //这里我开的10n过的,应该是多少我不清楚,望神牛解答
maxM=50000;
type
TQuery=record
l,r,k,id:longint
end;
var
n,m,root,numNode:longint;
a,left,right,fa,key,size:array[0..maxN] of longint;
q:array[1..maxM] of TQuery;
ans:array[1..maxM] of longint;
function leftRotate(i:longint):longint;
var
j:longint;
begin
j:=right[i];
right[i]:=left[j];
left[j]:=i;
fa[j]:=fa[i];
fa[i]:=j;
if right[i]<>0 then fa[right[i]]:=i;
size[j]:=size[i];
size[i]:=size[left[i]]+size[right[i]]+1;
exit(j);
end;
function rightRotate(i:longint):longint;
var
j:longint;
begin
j:=left[i];
left[i]:=right[j];
right[j]:=i;
fa[j]:=fa[i];
fa[i]:=j;
if left[i]<>0 then fa[left[i]]:=i;
size[j]:=size[i];
size[i]:=size[left[i]]+size[right[i]]+1;
exit(j);
end;
function newNode(f,k:longint):longint;
begin
inc(numNode);
key[numNode]:=k;
fa[numNode]:=f;
size[numNode]:=1;
exit(numNode);
end;
procedure splay(i:longint);
var
f,g:longint;
pg:^longint;
begin
while fa[i]<>0 do begin
f:=fa[i];
g:=fa[f];
if g=0 then begin
if i=left[f] then root:=rightRotate(f)
else root:=leftRotate(f);
break;
end;
if fa[g]=0 then pg:=@root
else if g=left[fa[g]] then pg:=@left[fa[g]]
else pg:=@right[fa[g]];
if f=left[g] then begin
if i=left[f] then begin
pg^:=rightRotate(g);
pg^:=rightRotate(f);
end else begin
left[g]:=leftRotate(f);
pg^:=rightRotate(g);
end;
end else begin
if i=right[f] then begin
pg^:=leftRotate(g);
pg^:=leftRotate(f);
end else begin
right[g]:=rightRotate(f);
pg^:=leftRotate(g);
end;
end;
end;
end;
procedure insert(k:longint);
var
i,j:longint;
begin
if root=0 then begin
root:=newNode(0,k);
exit;
end;
i:=root;
inc(size[root]);
if k<key[i] then j:=left[i] else j:=right[i];
while j<>0 do begin
inc(size[j]);
i:=j;
if k<key[j] then j:=left[j] else j:=right[j];
end;
if k<key[i] then begin
left[i]:=newNode(i,k);
splay(left[i]);
end else begin
right[i]:=newNode(i,k);
splay(right[i]);
end;
end;
function union(a,b:longint):longint;
var
i,j:longint;
begin
i:=a;
while right[i]<>0 do i:=right[i];
splay(i);
j:=b;
while left[j]<>0 do j:=left[j];
splay(j);
fa[i]:=j;
inc(size[j],size[i]);
left[j]:=i;
exit(j);
end;
procedure delete(k:longint);
var
i,l,r:longint;
begin
i:=root;
while key[i]<>k do
if k<key[i] then i:=left[i] else i:=right[i];
splay(i);
if (left[i]=0) and (right[i]=0) then root:=0
else if left[i]=0 then begin root:=right[i]; fa[right[i]]:=0; end
else if right[i]=0 then begin root:=left[i]; fa[left[i]]:=0; end
else begin
l:=left[i]; r:=right[i];
fa[l]:=0; fa[r]:=0; root:=0;
root:=union(l,r);
end;
key[i]:=-1;
end;
function select(k:longint):longint;
var
i:longint;
begin
i:=root;
while k<>size[left[i]]+1 do
if k<size[left[i]]+1 then i:=left[i] else begin
dec(k,size[left[i]]+1);
i:=right[i];
end;
exit(key[i]);
end;
function lessThan(var a,b:TQuery):boolean;
begin
if a.l<b.l then exit(true)
else if a.l>b.l then exit(false)
else if a.r>b.r then exit(true)
else exit(false);
end;
procedure qSort(l,r:longint);
var
i,j:longint;
x,tmp:TQuery;
begin
i:=l; j:=r; x:=q[(i+j)>>1];
repeat
while lessThan(q[i],x) do inc(i);
while lessThan(x,q[j]) do dec(j);
if i<=j then begin
tmp:=q[i]; q[i]:=q[j]; q[j]:=tmp;
inc(i); dec(j);
end;
until i>j;
if i<r then qSort(i,r);
if j>l then qSort(l,j);
end;
procedure init;
var
i:longint;
begin
readln(n,m);
for i:=1 to n do read(a[i]);
readln;
for i:=1 to m do
with q[i] do begin
readln(l,r,k);
id:=i;
end;
qSort(1,m);
end;
function max(a,b:longint):longint;
begin if a>b then exit(a) else exit(b); end;
function min(a,b:longint):longint;
begin if a<b then exit(a) else exit(b); end;
procedure main;
var
i,j:longint;
begin
for j:=q[1].l to q[1].r do
insert(a[j]);
ans[q[1].id]:=select(q[1].k);
for i:=2 to m do begin
if q[i].l>q[i-1].r then begin
for j:=q[i-1].l to q[i-1].r do delete(a[j]);
for j:=q[i].l to q[i].r do insert(a[j]);
end else if (q[i].l<=q[i-1].r) and (q[i].r>q[i-1].r) then begin
for j:=q[i-1].r+1 to q[i].r do insert(a[j]);
for j:=q[i-1].l to q[i].l-1 do delete(a[j]);
end else begin
for j:=q[i-1].l to q[i].l-1 do delete(a[j]);
for j:=q[i].r+1 to q[i-1].r do delete(a[j]);
end;
ans[q[i].id]:=select(q[i].k);
end;
end;
procedure print;
var
i:longint;
begin
for i:=1 to m do writeln(ans[i]);
end;
begin
init;
main;
print;
end.
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator