给你一个长度为n的序列(n为偶数),序列为[1,2,3,....n],操作m次,进行m次操作后输出这个序列
有三种操作
1:每次将最左边的元素移到最右边,重复x次
2:每次将最右边的元素移动到最左边,重复x次
3:交换[1,2] [3,4] ...[n-1,n]的元素
这个最开始我一直以为是模拟当然最后也是模拟,不过是巧妙的模拟
这个题目的关键就是,你要把这个序列分为一个奇数序列和一个偶数序列。你会发现这两个序列内部的元素永远不会变化而且如果把每一个序列的元素他们单独绕成一个环,这些元素的相对位置不会发生变化。你就只要求出每一个序列的最开始位置即可
#include<bits/stdc++.h>
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int maxn=1e5+5,mod=1e9+7,inf=0x3f3f3f3f;
int n,m;
int a[maxn],b[maxn];
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i+=2){
a[(i+1)/2]=i;
b[(i+1)/2]=i+1;
}
int beg1=1,beg2=1;//判断两个序列的开头元素
bool flag1=1,flag2=0;//判断两个序列开头元素为奇数还是偶数
for(int i=1,opt,x;i<=m;i++){
scanf("%d",&opt);
if(opt==2){
scanf("%d",&x);
beg1=(beg1-(x/2+(x%2&&!flag1))+(n/2)-1)%(n/2)+1;
beg2=(beg2-(x/2+(x%2&&!flag2))+(n/2)-1)%(n/2)+1;
}else if(opt==1){
scanf("%d",&x);
beg1=(beg1+(x/2+(x%2&&flag1))-1)%(n/2)+1;
beg2=(beg2+(x/2+(x%2&&flag2))-1)%(n/2)+1;
}
if(opt==3||(opt!=3&&x%2)){//如果转移时奇数,则交换奇偶性
swap(flag1,flag2);
}
}
if(flag1){
for(int i=1;i<=(n/2);i++){
printf("%d %d%c",a[(beg1+i-2+(n/2))%(n/2)+1],b[(beg2+i-2+(n/2))%(n/2)+1],(i==n/2)?‘\n‘:‘ ‘);
}
}else{
for(int i=1;i<=(n/2);i++){
printf("%d %d%c",b[(beg2+i-2+(n/2))%(n/2)+1],a[(beg1+i-2+(n/2))%(n/2)+1],(i==n/2)?‘\n‘:‘ ‘);
}
}
return 0;
}
原文:https://www.cnblogs.com/hunxuewangzi/p/13677128.html