codeforces#348-D - Little Artem and Dance-规律-模拟

37 篇文章 0 订阅
10 篇文章 0 订阅

http://codeforces.com/contest/669/problem/D


题目描述比较抽象点,具体化一下就是:

给你n个女的围成一个圈,n个男的围成一个圈

初始时,编号1的女对编号1的男。。以此类推。

女的是不动,男的做以下q次移动操作

操作有两类:

1 X   X》0 表示把所有男的向右移动X位,反之向左移,圈是首尾相接的。

2     1号女孩子对应的男生和2号互换,3号和4号换。。。以此类推,保证n%2==0



最后可以发现一个规律,所有的奇数男生编号次序是不变的。

也就是说 1 X 3 X 5 X 7 X 9。。等等。

为什么呢。。因为一开始就是这样的,操作1显然不会改变这个次序,

操作2 一交换,全部数都交换了。 奇数们还是以不变的次序排列。


偶数同理,因此我们每次只需要模拟  1 和 2 这两个男生的位置变换,最后根据他们的位置还原出整个数组即可

注意不要越界

 

#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std;

const double pi=acos(-1.0);
double eps=0.000001;

int n,q; 
int bb[1000005]; 
int main()
{

    cin>>n>>q;
	
    int i,j ,x; 
	int id1=1;
	int id2=2;
    for (i=1; i<=q;i++)
    {
		int t;
		cin>>t;
		if (t==1) 
		{
		 scanf("%d",&x);
		 if (x>0)
		 {
			 x%=n;
			 id1=(id1+x)%n;
			 if (id1==0)id1=n;
			 id2=(id2+x)%n;
			 if (id2==0)id2=n;
		 }
		 else
		 { 
			 x=-x;
			 x%=n;
			 id1=(id1-x+n)%n;
			 if (id1==0)id1=n;
			 id2=(id2-x+n)%n;
			 if (id2==0)id2=n;
		 }
		}
		else
		{
			if (id1%2) id1++;
			else id1--;
  
			 if (id1==0)id1=n;  
			 if (id1>n)id1-=n;  

			if (id2%2) id2++;
			else id2--;
			 if (id2==0)id2=n;  
			 if (id2>n)id2-=n;  
		} 
    } 
	int cnt=2;
	for (i=id2;i<=n;i+=2,cnt+=2)
		bb[i]=cnt;
	cnt=n;
	for (i=id2-2;i>=1;i-=2,cnt-=2)
		bb[i]=cnt;

 
	  cnt=1;
	for (i=id1;i<=n;i+=2,cnt+=2)
		bb[i]=cnt;
	cnt=n-1;
	for (i=id1-2;i>=1;i-=2,cnt-=2)
		bb[i]=cnt;

	for (i=1;i<=n;i++) 
		printf("%d ",bb[i]);
	printf("\n");






    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值