codeforces 950 D. A Leapfrog in the Array (思维)

https://codeforces.com/contest/950/problem/D
题意:有n个数,每个数i在2*i-1的位置上,其余位置为空,每次把最右边的数放在它左边最近的空位上,重复此过程,直到1~n填满

思路:发现n很大,而且有q次询问,那么时间复杂度应该为logn,我先打了表,想找规律发现奇数位置上的数不动,但偶数位置上的数变化规律很难找到…
因为每次给出是末尾位置,考虑如何把这个位置上的数还原,
ex:
1_2_3_4_5
1_2_3_45
1_2_354
1_2435
15243

观察5的跳动过程 9>8>6>2
初始位置为奇数,每次移动到一个偶数位置
题目给出最终位置x,那么考虑如何反推到初始位置,
思考一下,一定是x位置的数先到末位置,x右边的数还没有到x左边的空位,所以往回推时,一定要保持x左边偶数位为空才能知道它往右边跳了多少
x左边偶数位为空,那么x左边有x/2个数,x右边就有n-x/2-1个数,因为要到右边连续数子的右边的第一个空位,所以x+=n-x/2-1+1,这样就到了右边第一个空位,重复该过程知道x为奇数即可

#include<bits/stdc++.h>
#include<tr1/unordered_map>
#define fi first
#define se second
#define show(a) cout<<a<<endl;
#define show2(a,b) cout<<a<<" "<<b<<endl;
#define show3(a,b,c) cout<<a<<" "<<b<<" "<<c<<endl;
#define max3(a,b,c) max(a,max(b,c))
#define min3(a,b,c) min(a,min(b,c))
using namespace std;

typedef long long ll;
typedef pair<int, int> P;
typedef pair<P, int> LP;
const ll inf = 1e17 + 10;
const int N = 2e5 + 100;
const ll mod = 10007;
const int base=131;
tr1::unordered_map<ll,ll> mp;

ll n,m,id,x,y,k,q,t;
ll num[N],vis[N],cnt;
//ll a[51][N],b[51][N],c[N];
ll ans,flag;
ll sum[N];
ll a[N],b[N];
char s[N];
set<int> v;
set<int> st;
vector<int> res[N];
int main()
{
	ios::sync_with_stdio ( false );
	cin.tie ( 0 );
	cout.tie ( 0 );

	cin>>n>>q;
	while(q--)
	{
		cin>>x;
		while(x%2==0)
			x+=n-x/2;
		cout<<(x+1)/2<<endl;
	}




}
/*
提交之前检查空间大小
错误检查变量名
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值