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; }