http://codeforces.com/contest/669/problem/D
题目描述比较抽象点,具体化一下就是:
给你n个女的围成一个圈,n个男的围成一个圈
初始时,编号1的女对编号1的男。。以此类推。
女的是不动,男的做以下q次移动操作
操作有两类:
1 X X》0 表示把所有男的向右移动X位,反之向左移,圈是首尾相接的。
2 1号女孩子对应的男生和2号互换,3号和4号换。。。以此类推,保证n%2==0
最后可以发现一个规律,所有的奇数男生编号次序是不变的。
也就是说 1 X 3 X 5 X 7 X 9。。等等。
为什么呢。。因为一开始就是这样的,操作1显然不会改变这个次序,
操作2 一交换,全部数都交换了。 奇数们还是以不变的次序排列。
偶数同理,因此我们每次只需要模拟 1 和 2 这两个男生的位置变换,最后根据他们的位置还原出整个数组即可
注意不要越界
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std;
const double pi=acos(-1.0);
double eps=0.000001;
int n,q;
int bb[1000005];
int main()
{
cin>>n>>q;
int i,j ,x;
int id1=1;
int id2=2;
for (i=1; i<=q;i++)
{
int t;
cin>>t;
if (t==1)
{
scanf("%d",&x);
if (x>0)
{
x%=n;
id1=(id1+x)%n;
if (id1==0)id1=n;
id2=(id2+x)%n;
if (id2==0)id2=n;
}
else
{
x=-x;
x%=n;
id1=(id1-x+n)%n;
if (id1==0)id1=n;
id2=(id2-x+n)%n;
if (id2==0)id2=n;
}
}
else
{
if (id1%2) id1++;
else id1--;
if (id1==0)id1=n;
if (id1>n)id1-=n;
if (id2%2) id2++;
else id2--;
if (id2==0)id2=n;
if (id2>n)id2-=n;
}
}
int cnt=2;
for (i=id2;i<=n;i+=2,cnt+=2)
bb[i]=cnt;
cnt=n;
for (i=id2-2;i>=1;i-=2,cnt-=2)
bb[i]=cnt;
cnt=1;
for (i=id1;i<=n;i+=2,cnt+=2)
bb[i]=cnt;
cnt=n-1;
for (i=id1-2;i>=1;i-=2,cnt-=2)
bb[i]=cnt;
for (i=1;i<=n;i++)
printf("%d ",bb[i]);
printf("\n");
return 0;
}