题意: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; } } }