题目描述
你有N(2<=N<=10000)张牌,每张牌有一个数字,一开始从第一张到最后一张分别为1到N,你可以进行以下操作,每个操作用两个数a和b表示,其中a表示操作方式,当a取1到3时,b表示这种方式进行的次数,下面是对个操作的描述:
a=1:把第一张移到最后一张;
a=2:把最后一张移到第一张;
a=3:把前2张牌交换;
a=4:输出第b牌的数字。
输入
第一行输入N和M,表示牌数以及操作数量,接下来M行,每行两个整数a和b描述操作方式。
输出
对于每个a=4的操作输出第b张牌上的数字。
也是模拟,分别记录头和尾的位置,然后模拟就可以了,注意数组一定要够大
var
a:array[-1000000..1000000] of longint;
i,j,k,n,m,s,x,y,l,r,t:longint;
begin
assign(input,'j2.in'); reset(input);
assign(output,'j2.out');rewrite(output);
readln(n,m);
l:=0; r:=0+n-1;
for i:=0 to n+0-1 do
a[i]:=i-(-1);
for i:=1 to m do
begin
readln(x,y);
if x=4 then
begin
writeln(a[y+l-1]);
end
else begin
for j:=1 to y do
begin
if x=1 then
begin
r:=r+1;
a[r]:=a[l];
a[l]:=0;
inc(l);
end
else if x=2 then
begin
dec(l);
a[l]:=a[r];
a[r]:=0;
dec(r);
end
else if x=3 then
begin
t:=a[l];
a[l]:=a[l+1];
a[l+1]:=t;
end;
end;
end;
end;
end.
]]>

Comments NOTHING