讨论 / 瑞士轮(堆排+归并)为什么一个测试点会超时
chenghao 2013-10-08 20:41:00
点我顶贴 收藏 删除
type arr=array[1..1000000,1..2] of longint;

var a,c1,c2,c:arr;

b:array[1..1000000] of longint;

n,r,q:longint;

////////////////////////////////////////////////////////////////////////////////

procedure fixdu(l,r:longint);

var p1,p2:longint;

time:array[1..2] of longint;

t,t1,t2,t3:boolean;

begin

p1:=l; p2:=p1*2; {time[1]:=a[p1,1];time[2]:=a[p1,2];}time:=a[p1];

t1:=(p2<=r)and((a[p2,2]<time[2])or((a[p2,2]=time[2])and(a[p2,1]>time[1])));

t2:=(p2<r)and((a[p2+1,2]<time[2])or((a[p2+1,2]=time[2])and(a[p2+1,1]>time[1])));

t:=t1 or t2;

while t do

begin

t3:=(p2<r)and((a[p2+1,2]<a[p2,2])or((a[p2+1,2]=a[p2,2])and(a[p2+1,1]>a[p2,1])));

if t3 then inc(p2);

{a[p1,1]:=a[p2,1]; a[p1,2]:=a[p2,2];}a[p1]:=a[p2];

p1:=p2; p2:=p1*2;

t1:=(p2<=r)and((a[p2,2]<time[2])or((a[p2,2]=time[2])and(a[p2,1]>time[1])));

t2:=(p2<r)and((a[p2+1,2]<time[2])or((a[p2+1,2]=time[2])and(a[p2+1,1]>time[1])));

t:=t1 or t2;

end;

a[p1,1]:=time[1];a[p1,2]:=time[2];

end;

////////////////////////////////////////////////////////////////////////////////

procedure dsort;

var i,j,sw:longint;

begin

for i:=n downto 1 do fixdu(i,n*2);

for i:=1 to n*2-1 do

begin

for j:=1 to 2 do

begin

sw:=a[1,j]; a[1,j]:=a[n*2-i+1,j]; a[n*2-i+1,j]:=sw;

end;

fixdu(1,n*2-i);

end;

end;

////////////////////////////////////////////////////////////////////////////////

procedure init;

var i:longint;

begin

readln(n,r,q);

for i:=1 to n*2 do read(a[i,2]);

readln;

for i:=1 to n*2 do a[i,1]:=i;

for i:=1 to n*2 do read(b[i]);

end;

////////////////////////////////////////////////////////////////////////////////

procedure main;

var i,k,p1,p2,p:longint;

begin

dsort;

for k:=1 to r do

begin

for i:=1 to n do

begin

if b[a[2*i-1,1]]>b[a[2*i,1]] then

begin

c1[i,1]:=a[2*i-1,1]; c1[i,2]:=a[2*i-1,2]+1;

c2[i,1]:=a[2*i,1]; c2[i,2]:=a[2*i,2];

end else

begin

c1[i,1]:=a[2*i,1]; c1[i,2]:=a[2*i,2]+1;

c2[i,1]:=a[2*i-1,1]; c2[i,2]:=a[2*i-1,2];

end;

end;

p1:=1; p2:=1; p:=0;

while (p1<=n)and(p2<=n) do

if (c1[p1,2]>c2[p2,2])or((c1[p1,2]=c2[p2,2])and(c1[p1,1]<c2[p2,1])) then

begin

inc(p); a[p]:=c1[p1]; inc(p1);

end else

begin

inc(p); a[p]:=c2[p2]; inc(p2);

end;

if p1<=n then

for i:=p1 to n do

begin

inc(p); a[p]:=c1[i];

end;

if p2<=n then

for i:=p2 to n do

begin

inc(p); a[p]:=c2[i];

end;

end;

end;

////////////////////////////////////////////////////////////////////////////////

procedure print;

begin

writeln(a[q,1]);

end;

////////////////////////////////////////////////////////////////////////////////

begin

init;

main;

print;

end.

#1 chenghao@2013-10-08 20:41:00
回复 删除
我重新交了一遍一模一样的代码,过了,最大的点也就是700多ms而已。。。

这。。。。

查看更多回复
提交回复