Little Artem and Dance(思路)

xiaoxiao2021-02-27  363

题目来源:https://cn.vjudge.net/problem/CodeForces-668B 【题意】 对从1 到 n的递增序列进行两种操作,输出操作之后的序列。 其中第一种操作(代号为1)是,将序列往后推迟x位,第二种(代号为2)操作是将奇数位的数与相邻偶数位的数进行交换。 【思路】 由于数据超级大,所以,不可能进行数组模拟,所以,就要想着找规律。 然后找着找着会发现只要知道1 ,2的位置就能知道其他数的位置(相对位置不变),例如,序列4 5 6 1 2 3,1的 位置是4,2的位置是5,1的位置加2便是3的位置,3的位置加2便是5的位置,但是此时已经超过n了,所以用到取余,得3的位置是0,5的位置是2。。。停一下,由序列可知,3的位置是6而不是0,但是6%n就是0呀,所以该怎么处理呢,这个时候就有一个好巧的方法(无意间试出来的),(6-1)%n+1,得6,神奇的躲过了取余等于0这一陷阱。 【代码】

#include<map> #include<stack> #include<queue> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<iostream> #include<string> #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; const int INF=1e9; typedef long long LL; int n,q; int a,b; int array[1000000+10]; int main() { scanf("%d%d",&n,&q); a =1,b = 2; for (int i = 1; i<=q; i++) { int op; scanf("%d",&op); if (op==1) { int x; scanf("%d",&x); a =(a+x+n-1)%n+1; b =(b+x+n-1)%n+1; // printf("a=%d b=%d\n",a,b); } else { if(a&1) a+=1; else a-=1; if(b&1) b+=1; else b-=1; // printf("a=%d b=%d\n",a,b); } } for (int i = 0;i<=(n/2-1); i++) { array[(a+i*2-1)%n+1]=1+i*2; array[(b+i*2-1)%n+1]=2+i*2; } for(int i=1; i<=n; i++) printf("%d ",array[i]); printf("\n"); }
转载请注明原文地址: https://www.6miu.com/read-5632.html

最新回复(0)