题意:n对情侣围成一圈在跳舞,给出q个操作,表示男生的移动操作
1 x x为负数表示所有的男生逆时针走x步 x为正数表示所有的男生顺时针走x步
2 表示当前的男生相对奇偶交换顺序 比如swap(1,2) swap(3,4) 而不能sawp(2,3)
思路:x为负数时变成顺时针走x+n步
可以发现所有的奇数位置男生都是移动相同的步数ans1
所有的偶数位置的男生也是移动相同的步数 ans2
枚举1位置的男生的移动步数和2位置的男生移动步数即可求出答案
1位置的男生
当前的ans为奇数 ans+=x 若前面操作2交换了奇数次 则ans++ 否则ans--
当前的ans为偶数 ans+=x 若前面操作2交换了奇数次 则 ans++ 否则 ans--
2位置的男生
当前的ans2为奇数 ans2+=x 若前面操作2交换了奇数次 则ans2++ 否则ans2--
当前的ans2为偶数 ans2+=x 若前面操作2交换了奇数次 则 ans2++ 否则 ans2--
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<vector>
#include <ctime>
#include<queue>
#include<set>
#include<map>
#include<stack>
#include<iomanip>
#include<cmath>
#define mst(ss,b) memset((ss),(b),sizeof(ss))
#define maxn 0x3f3f3f3f
#define MAX 1000100
///#pragma comment(linker, "/STACK:102400000,102400000")
typedef long long ll;
typedef unsigned long long ull;
#define INF (1ll<<60)-1
using namespace std;
int n,q;
int type[2000100];
ll x[2000100],anw[2000100];
int main(){
scanf("%d%d",&n,&q);
for(int i=1;i<=q;i++){
scanf("%d",&type[i]);
if(type[i]==1) {
scanf("%I64d",&x[i]);
if(x[i]<0) x[i]+=n;
}
else x[i]=x[i-1];
}
ll num=0,ans=1;
for(int i=1;i<=q;i++){
if(type[i]==1){
if(num && num%2){
if(ans%2==1) ans++;
else ans--;
}
ans+=x[i];
num=0;
} else num++;
}
if(num && num%2){
if(ans%2==1) ans++;
else ans--;
}
ans--;
num=0;
ll ans2=2;
for(int i=1;i<=q;i++){
if(type[i]==1){
if(num && num%2){
if(ans2%2==1) ans2++;
else ans2--;
}
ans2+=x[i];
num=0;
} else num++;
}
if(num&& num%2){
if(ans2%2==1) ans2++;
else ans2--;
}
num=0;
ans2-=2;
int t;
for(int i=1;i<=n;i++){
if(i%2) t=(i+ans+n)%n;
else t=(i+ans2+n)%n;
if(t==0) anw[n]=i;
else anw[t]=i;
}
for(int i=1;i<=n;i++) printf("%I64d ",anw[i]);
cout<<endl;
return 0;
}<strong>
</strong>