瑞士轮 60分求找错 不胜感激

var sh,ba,zo,sl,el,bh,se,bl:array[1..200000] of longint;
//sh是一轮下来胜的人的编号(sheng),ba是败的人的编号(bai),zo是当前总共的排名(zong),bh是当前排名的编号(bianhao),sl是当前排名的实力(shili),el是归并时储存的排名(else),se是归并时储存的排名的实力(sl else),bl是归并时储存的排名的编号(bh else)
i,j,k,l,q,w,e,n,m,s,mi:longint;//n是总人数二分之一,m是总轮数,mi是要求排名
procedure gp;//归并
var i,j,k,l,q,w,e:longint;
begin
i:=1;k:=1; e:=0;
while e<n*2 do
begin
inc(e);
if (i<=n)and(zo[sh[i]]>zo[ba[k]])or((zo[sh[i]]=zo[ba[k]])and (bh[sh[i]]<bh[ba[k]]))
then begin se[e]:=sl[sh[i]];el[e]:=zo[sh[i]];bl[e]:=bh[sh[i]];inc(i);end else
begin se[e]:=sl[ba[k]];el[e]:=zo[ba[k]];bl[e]:=bh[ba[k]];inc(k);end;
end;
for i:=1 to 2*n do begin zo[i]:=el[i];bh[i]:=bl[i];sl[i]:=se[i];end;//将归并完的东西存到原来地方
end;
procedure qsort(l,r:longint);//快排
var i,j,mids,midz,midb,e:longint;
begin
i:=l;j:=r;mids:=random(r-l+1)+l;midz:=zo[mids];midb:=bh[mids];
mids:=sl[mids];
repeat
while (zo[i]>midz)or((zo[i]=midz)and(bh[i]<midb)) do inc(i);
while (zo[j]<midz)or((zo[j]=midz)and(bh[j]>midb)) do dec(j);
if i<=j then
begin e:=zo[i];zo[i]:=zo[j];zo[j]:=e;e:=sl[i];sl[i]:=sl[j];sl[j]:=e;e:=bh[i];bh[i]:=bh[j];bh[j]:=e;inc(i);dec(j);end;
until i>j;
if i<r then qsort(i,r);
if j>l then qsort(l,j);
end;
begin
readln(n,m,mi);
for i:=1 to n*2 do begin read(zo[i]);bh[i]:=i;end;
for i:=1 to n*2 do read(sl[i]);
qsort(1,n*2);
for i:=1 to m do
begin
for j:=1 to n do
begin
if sl[j*2]>sl[j*2-1] then begin inc(zo[j*2]);sh[j]:=j*2;ba[j]:=j*2-1;end else
begin inc(zo[j*2-1]);sh[j]:=j*2-1;ba[j]:=j*2;end;
end;
gp;
end;
writeln(bh[mi]);
end.

3 条评论

  • @ 2014-01-23 23:57:06

    不知你是否是超时,如果是,可以尝试剪枝.
    具体可以前往题解区查看我的题解.
    虽然语言不一样,但是你可以只看思路
    虽然我语言有些混乱.

  • @ 2013-10-28 22:42:29

    再再顶一下

  • @ 2013-10-28 12:40:42

    再顶一下

  • 1

信息

ID
1771
难度
7
分类
模拟 | 数据结构 | 队列 点击显示
标签
递交数
3535
已通过
703
通过率
20%
被复制
19
上传者