CodeForces 669D

誒,沒想到這題是D題,不錯不錯,我居然做出來了。

題意:給你n對男女圍成一個圈然後有q個詢問,詢問有兩種當第一個數爲1是後面一個數爲x代表所有男生移動x步,而如果第一個數爲2代表第一個女生對應的男生和第二個女生對應的男生互換位置,後面所有都一樣互換,即奇偶互換,注意女生一直不動,最後輸出所有男生改變後的位置。

思路:開始的時候沒注意女生一直不動理解錯了題後來改正後發現這題還是比較easy的,首先我們要知道其中幾個規律,即奇數的男生之間差距不變,他們變動是一致的,偶數的男生也一樣,我們就可以定位1號和2號最爲代表,然後記錄移動的步數,當出現查詢2時若1號男生在偶數位置就減一步奇數加一步,2號相反。最後以他兩爲始逐步輸出其他男生位置即可。

代碼如下:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define INF 0x3f3f3f3f
int d[1000005];
int main()
{
  int n,q,ssum=2,sum=1,a,x;
  scanf("%d%d",&n,&q);
  for(int i=0;i<q;i++)
  {
    scanf("%d",&a);
    if(a==1)
    {
      scanf("%d",&x);
      sum+=x;
      while(sum>n) sum-=n;
      while(sum<=0) sum+=n;
      ssum+=x;
      while(ssum>n) ssum-=n;
      while(ssum<=0) ssum+=n;
    }
    else
    {
      if(sum%2)
      {
        sum++;
      }
      else
      {
        sum--;
      }
      if(ssum%2)
      {
        ssum++;
      }
      else ssum--;
      if(sum<=0) sum=n;
      if(sum>n) sum=1;
      if(ssum<=0) ssum=n;
      if(ssum>n) ssum=1;
    }
  }
  for(int i=1;i<=n;i++)
  {
    d[i]=i;
  }
  int ans=0,cnt=0;
  //printf("%d %d\n",sum,ssum);
  for(int i=1;i<=n;i+=2)
  {
    d[sum]=i;
    sum+=2;
    sum%=n;
    if(sum==0) sum=n;
  }
  for(int i=2;i<=n;i+=2)
  {
    d[ssum]=i;
    ssum+=2;
    ssum%=n;
    if(ssum==0) ssum=n;
  }
  for(int i=1;i<n;i++)
  {
    printf("%d ",d[i]);
  }
  printf("%d\n",d[n]);
}



發佈了56 篇原創文章 · 獲贊 5 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章