标签:
题目链接:http://codeforces.com/problemset/problem/669/D
给你n个数,一开始是1 2 3 4 5 6 ... n 这样的
现在有两个操作,第一个操作是所有数向右边移动x个位置
第二个操作奇数和偶数的位置互换
现在有Q个指令,问最后的序列是什么;
n and q (2 ≤ n ≤ 1 000 000, 1 ≤ q ≤ 2 000 000)
由于数据范围比较大,但是我们可以发现所以得偶数他们相邻的总是2 4 6 8 10...奇数都是1 3 5 7 9 11...也就是说无论怎么变他们的相对位置是不变的,就是每个数(奇数或偶数)的前后总是固定的,
所以我们可以记录数字1和2的位置在哪里,然后依次填出最终答案;
为了方便我们下标从0开始;
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <stack> #include <map> #include <vector> using namespace std; typedef long long LL; #define N 1000100 #define met(a, b) memset(a, b, sizeof(a)) int n, Q, a[N]; int main() { while(scanf("%d %d", &n, &Q)!=EOF) { met(a, 0); int first = 0, second = 1, op, x; while(Q--) { scanf("%d", &op); if(op == 1) { scanf("%d", &x); first = (x + first + n) % n; second = (x + second + n) % n; } else {///如果1所在位置下标是偶数(相对于下标为0来说的),那么1的位置就要往后挪一位,2则相反; if(first%2) { first = (first - 1 + n) % n; second = (second + 1 + n) % n; } else { first = (first + 1 + n) % n; second = (second - 1 + n) % n; } } } int num = 1; while(num <= n)///填入n个数 { a[first] = num++;///奇数所在位置 a[second] = num++; first = (first+2) % n;///要加两个的, second = (second+2) % n; } for(int i=0; i<n; i++) printf("%d%c", a[i], i==n-1?‘\n‘:‘ ‘); } return 0; } /* 6 9 2 1 -2 2 1 -6 1 -6 1 4 2 1 -1 2 2 5 4 1 6 3 */
D. Little Artem and Dance---cf669D(模拟)
标签:
原文地址:http://www.cnblogs.com/zhengguiping--9876/p/5463865.html