华东交通大学2017年ACM“双基”程序设计竞赛 1002

Problem Description

一天YZW参加了学校组织交际舞活动,活动的开始活动方分别给男生和女生从1-n进行编号,按照从小到大顺时针的方式进行男女搭档分配,相同编号的男女组合成一对,例如一号男生与一号女生配对,以此类推。可是YZW对其中一个小姐姐一见钟情,于是机智的他向管理员提出了两种操作
1.在这种情况下,管理员会给出移动的方向和大小,然后所有的男生向着这个方向移动x个位置。2.管理员会把相邻的奇数和偶数位置上的男生互换。
在其中女生的位置是不会变的。可是YZW不知道经过这些Q次操作后,他自己身在何方,能否到达自己喜欢的小姐姐身边。

Input

输入一个T代表T组数据(T<=10),每组输入一个n和q(2≤n≤200000,1≤q≤1000000,其中n为偶数),分别代表有n对男女和有q次操作。
接下来是q行,每一行输入:
1.x代表所有男生移动的位置的大小。同时x>0表示顺时针移动,x<0表示逆时针移动。
2.代表管理员会把相邻的奇数和偶数位置上的男生互换。

Output

输出1号到n号小姐姐配对的分别是几号男生。

Sample Input

1
6 3
1 2
2
1 2

Sample Output

4 3 6 5 2 1

解法:CF原题,就不必解释了http://codeforces.com/problemset/problem/641/C
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int ope1 = 0,ope2 = 1;
 4 int n,q;
 5 int a[1000005];
 6 int t;
 7 int main()
 8 {
 9     scanf("%d",&t);
10     while(t--)
11     {
12         scanf("%d%d",&n,&q);
13         while(q--)
14         {
15             int a,b;
16             scanf("%d",&a);
17             if(a==1)
18             {
19                 scanf("%d",&b);
20                 ope1=(ope1+b+n)%n;
21                 ope2=(ope2+b+n)%n;
22             }
23             else if(a==2)
24             {
25                 if(ope1%2==0)
26                 {
27                     ope1++;
28                     ope2--;
29                 }
30                 else
31                 {
32                     ope1--;
33                     ope2++;
34                 }
35             }
36         }
37         int z=1;
38         for(int i=0,j=ope1; i<n/2; i++,j=(j+2)%n)
39         {
40             a[j]=z;
41             z=z+2;
42         }
43         z=2;
44         for(int i=0,j=ope2; i<n/2; i++,j=(j+2)%n)
45         {
46             a[j]=z;
47             z=z+2;
48         }
49         for(int i=0; i<n-1; i++)
50             printf("%d ",a[i]);
51         printf("%d
",a[n-1]);
52     }
53     return 0;
54 }
原文地址:https://www.cnblogs.com/yinghualuowu/p/7857569.html