题意:
给出n个点 n为偶数,绕成一圈,两种操作
1. 1 x 顺时针移动x个位置
2. 2 奇偶位置的数字交换 比如 1 2 3 4 就变成 2 1 4 3
给出q个操作,输出最后排列
思路:
分析第一种操作,顺时针移动位置,所有数字 的相对顺序不变,奇数之间和偶数之间相对位置也不改变
第二种操作,只是相邻的奇数位和偶数位置交换,第一个和第二个交换,第三个和第四个交换....
这样原本奇数位置的变到偶数位置,偶数位置变到奇数位置
那么奇数1,3,5,7,9....的相对位置还是不变还是相差两个,偶数2,4,6,8...的位置也还是相差2
因此我们只要更新1和2的位置,根据这两个数字就可以推出所有数字。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll>pii;
typedef vector<int>vi;
#define rep(i,a,b) for(int i=(a);i<(b);i++)
#define fi first
#define se second
#define de(x) cout<<#x<<"="<<x<<endl
#define per(i,a,b) for(int i=(b)-1;i>=(a);--i)
const int N=1e6+5;
int a[N];
int main()
{
int n,q;
scanf("%d%d",&n,&q);
int p1,p2;
p1=1;
p2=2;
int tp,x;
while(q--){
scanf("%d",&tp);
if(tp==1){
scanf("%d",&x);
p1+=x;
p2+=x;
if(p1<0)p1+=n;
else if(p1>n)p1-=n;
if(p2<0)p2+=n;
else if(p2>n)p2-=n;
}
else{
if(p1%2==0)p1--;
else p1++;
if(p2%2==0)p2--;
else p2++;
if(p1<0)p1+=n;
else if(p1>n)p1-=n;
if(p2<0)p2+=n;
else if(p2>n)p2-=n;
}
}
int cur=1;
for(int i=0;i<n/2;i++){
int nxt=p1+i*2;
nxt%=n;
if(nxt==0)nxt=n;
a[nxt]=cur;
cur+=2;
}
cur=2;
for(int i=0;i<n/2;i++){
int nxt=p2+i*2;
nxt%=n;
if(nxt==0)nxt=n;
a[nxt]=cur;
cur+=2;
}
rep(i,1,n+1)
printf("%d ",a[i]);
}