Codeforces Round #469 (Div. 2) D題 A Leapfrog in the Array (思維)

題目在這裏插入圖片描述

樣例

在這裏插入圖片描述

題意

一個長度爲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;
}
發佈了184 篇原創文章 · 獲贊 24 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章