我不止一次说过此题是数据结构题,请查阅二叉查找树(BST)的相关内容,即可解出此题。
原先的积分悬赏依然有效
type poi=^rex;
rex=record
date,s:longint;
left,right:poi;
end;
var tree:poi;
i,j,k,n,m,gh,sam:longint;
rq:array[0..1000]of longint;
b:array[0..200000]of longint;
procedure buildtree(l,r:longint;var tre:poi);
var mid:longint;
begin
if l>r then exit;
mid:=(l+r) div 2;
new(tre);
tre^.date:=mid;
tre^.left:=nil;tre^.right:=nil;
if l=r then
begin
tre^.s:=1;
exit;
end;
buildtree(l,mid-1,tre^.left);
buildtree(mid+1,r,tre^.right);
tre^.s:=1;
if tre^.right<>nil then inc(tre^.s,tre^.right^.s);
if tre^.left<>nil then inc(tre^.s,tre^.left^.s);
end;
function cas(var tre:poi):longint;
begin
if tre=nil then exit(0);
if (tre^.left=nil) and (tre^.right=nil) then exit(1);
if tre^.left<>nil then cas:=tre^.left^.s+1
else cas:=tre^.s-tre^.right^.s;
end;
procedure del(key:longint;var tre:poi);
var q,p,r:poi;
begin
q:=nil;
p:=tre;
while key<>cas(p) do
begin
q:=p;
if key<cas(p) then p:=p^.left else
begin
key:=key-cas(p);
p:=p^.right;
end;
dec(q^.s);
end;
b[p^.date]:=i;
dec(p^.s);
if (p^.left=nil) and (p^.right=nil) then
begin
if q=nil then begin tre:=nil; exit; end;
if p=q^.left then q^.left:=nil else q^.right:=nil;
end;
if (p^.left=nil) xor (p^.right=nil) then
begin
if p^.left<>nil then r:=p^.left else r:=p^.right;
if q=nil then
begin
tre:=r;exit;
end;
if p=q^.left then q^.left:=r else q^.right:=r;
end;
if (p^.left<>nil) and (p^.right<>nil) then
begin
r:=p;
q:=p;
p:=p^.left;
while p^.right<>nil do
begin
dec(p^.s);
q:=p;
p:=p^.right;
end;
r^.date:=p^.date;
if p=q^.left then q^.left:=p^.left else q^.right:=p^.left;
end;
end;
begin
readln(n,m,gh);
k:=1;
for i:=2 to n do k:=(k+m-1) mod i+1;writeln(k);
for i:=1 to gh do readln(rq[i]);
buildtree(1,n,tree);
sam:=1;
for i:=1 to n do
begin
sam:=(sam+m-1-1) mod (n-i+1)+1;
del(sam,tree);
end;
for i:=1 to gh do writeln(b[rq[i]]);
end.
奖金!?太打击人了!