http://codeforces.com/problemset/problem/669/D
题目大意: 有n对人 男生和女生 开始时 每个人的标号是(1,2,3,。。。n) 女生们围成一个圈 男生在外面围成一个圈
有q个操作 第一种情况是 如果x>0男生顺时针走x步 否则 逆时针走
第二种情况是 男生现在对应的女生的编号如果是奇数 这个男生就跟对应的女生的编号是偶数的男生交换位置
最后输出每个男生的编号
分析: 我们可以想到 其实奇数编号的男生移动的是一样的 偶数也是
我们就用两个参数 代表奇数编号的男生 和偶数编号的男生 的移动的位置数
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<ctype.h> #include<math.h> #include<queue> #include<algorithm> #include<iostream> using namespace std; #define N 5000050 const double ESP = 1e-8; #define INF 0x3f3f3f3f #define memset(a,b) memset(a,b,sizeof(a)) int a[N],s[N]; int main() { int n,q; while(scanf("%d %d",&n,&q)!=EOF) { int t=0; int v=0; int j,o; j=o=0; for(int i=0;i<q;i++) { scanf("%d",&t); if(t==1) { scanf("%d",&v); j+=v; o+=v; } else { if(j%2==0) j++; else j--; if(o%2==0) o--; else o++; } j=(j+n)%n; o=(o+n)%n; } for(int i=0;i<n;i++) { if(i%2==0) { a[i]=i+j; a[i]=a[i]%n; s[a[i]+1]=i+1; } else { a[i]=i+o; a[i]=a[i]%n; s[a[i]+1]=i+1; } } for(int i=1;i<=n;i++) { printf("%d ",s[i]); } printf(" "); } return 0; }