专栏文章

题解:CF949B A Leapfrog in the Array

CF949B题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miqvev8o
此快照首次捕获于
2025/12/04 11:22
3 个月前
此快照最后确认于
2025/12/04 11:22
3 个月前
查看原文
duel 做到了,发现好难,不会做!
首先我们发现整个过程都没有什么规律非常的烦人,但是我们可以模拟一下这个过程,发现每次填第 ii 个空格的时候,这后面正好是一连串的连续数字,而且数字个数就是 nin-i
而且我们还知道一个当下有数字的位置,今后再也不会被别的数字占领。
所以考虑倒着做,因为我们知道这个空格是从哪个位置的数字跳过来的(因为我们知道后面有多少连续数字,肯定是连续数字最后一个跳过来了),所以可以往后跳,直接模拟这个过程即可。因为每次距离结尾的距离减半,所以单次查询复杂度是对数 O(logn)O(\log n) 的。
注意如果跳到某个奇数位置(即初始时有值的位置)时,直接结束,输出答案。
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
bool Mbe;
const int N=2e5+10;
inline int _abs(int x){if(x>0) return x;return -x;}

void fake_main(){
	int n,q; cin>>n>>q;
	for(int i=1;i<=q;i++){
		int tmp; cin>>tmp;
		while(1){
			if(tmp%2==1){//奇数位置!直接输出答案
				cout<<(tmp+1)/2<<"\n";
				break;
			}
			
			int back=n-tmp/2;//算一下后面有多少数字
			tmp+=back;//往后跳
		}
	}
}

bool Med;
signed main(){
	ios::sync_with_stdio(false);
	cerr<<fabs(&Med-&Mbe)/1048576.0<<"MB\n";
	int t; t=1;
	while(t--) fake_main();
	cerr<<"\n"<<clock()*1.0/CLOCKS_PER_SEC*1000<<"ms\n";
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...