CodeForces

 题意:n个数1~n(n<=1e18)依次放在一个数组中,第i个数位置为2i-1,其它地方是空的。现在重复以下操作:将最右边的数放到离其左边最近的空的位置,直到所有数移到前一半的位置中。有q<=200000个询问,问你第i个数最终再哪个位置。

题解:这题被某人秒了,所以估计核心代码量不超过2行,于是XJB找规律,找了三四十分钟A了,不明觉厉。

    找规律的方向是按照数据必定是个qlogn的算法,输入一个n,肯定要不断除2,又发现前n/2个数一直不动,又发现貌似后n/2的数有些神秘的间隔。最后XJB写了个代码直接AC了

#define  _CRT_SECURE_NO_WARNINGS
#include<cstdio>  
#include<algorithm>  
#include<iostream>
using namespace std;
typedef long long ll;

int main() {
    ll n, q;
    cin >> n >> q;
    while (q--) {
        ll x;
        scanf("%lld", &x);
        while (1) {
            if ((x + 1) % 2 == 0) { printf("%lld
", (x + 1) / 2); break; }
            else x /= 2, x += n;
        }

    }

}
成功的路并不拥挤,因为大部分人都在颓(笑)
原文地址:https://www.cnblogs.com/SuuT/p/8593815.html