題目
樣例
題意
一個長度爲2*n的數組,奇數位上依次是1 2 3 4 5 6……,也就是每放一個數字空一個格子,然後每次操作我們都會把最右邊的一個數字,放到最右邊的一個被兩個數字夾着的空格,直到沒有被夾着的空格存在爲止。
然後問你,停止後,數組上pos位置的數字是多少。
思路
2*n長度的數組,n個數字,最後停下來,肯定是前n的空格被佔用,後n個不被佔用。
① 對於這前n個數字,我們知道如果pos&1,也就是詢問的pos爲奇數,那麼這個位置上的數字必定沒有被挪動過。所以答案就是 pos / 2 + 1
② 如果詢問的位置pos爲偶數, 我們知道,當有某個位置上的數字接下來就要跳到pos位置上的時候,從pos位置到這個數字的位置肯定都有數字,也就是連續的一片數字,那麼我們也可以知道,在數字剛跳到pos位置的時候,pos左邊一共有pos / 2個數字, 右邊一共有n - pos / 2 - 1個數字(減1是因爲數字剛跳過來,pos位置上也有一個數字)。
那麼這個時候,我們就知道,詢問的pos位置上的數字原先在的位置是 pos +(n - pos / 2 - 1)+ 1,我們不斷的執行這個操作,直到pos爲奇數即可。
代碼
#include <cstdio>
#include <cstdlib>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 10;
int main()
{
ll n, q;
scanf("%lld %lld", &n, &q);
while(q--)
{
ll x;
scanf("%lld", &x);
while(1)
{
if(x & 1)
break;
else
x = x + (n - x / 2 - 1) + 1;
}
printf("%lld\n", x / 2 + 1);
}
return 0;
}