jzoj 1589. 【普及模拟】洗牌

发布于 2019-03-22  993 次阅读


 

题目描述

你有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.

 

 

]]>