Codeforces 950 D. A Leapfrog in the Array

http://codeforces.com/contest/950/problem/D

 

前n/2个格子的奇数下标的数没有参与移动

候n/2个格子的奇数下标的数一定是一路移向偶数下标移

所以还原数的初始位置时,让数沿原来的路线向右移动,到达的第一个奇数下标就是这个数的初始位置

在初始位置a的数是(a+1)/2

现在就剩下了如何还原数向左移的过程

假设数a最后移到了位置x,

在位置x之前有 x/2 个奇数位有数

a移到了x,说明除了前面的数,剩下的数都在x之后

所以位置x之后有n-x/2-1 个数,这n-x/2-1个数一定是相邻的

所以a在最后一次移动前的位置为 x+n-x/2

如果这个位置是奇数位,结束

如果还是偶数位,同样的分析方式,继续变成x+n-x/2

 

 

#include<iostream>

using namespace std;

int main()
{
    long long n,q,x;
    cin>>n>>q;
    while(q--)
    {
        cin>>x;
        while(!(x&1)) x+=n-x/2;
        cout<<(x+1>>1)<<'\n';
    }
}

 

posted @ 2018-03-22 10:45  TRTTG  阅读(312)  评论(0编辑  收藏  举报