D. Little Artem and Dance---cf669D

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;
}
原文地址:https://www.cnblogs.com/linliu/p/5442520.html