专栏文章

题解:P12531 [XJTUPC 2025] Beat Verdict: Precision Strike

P12531题解参与者 1已保存评论 1

文章操作

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

当前评论
1 条
当前快照
1 份
快照标识符
@mip8plus
此快照首次捕获于
2025/12/03 07:59
3 个月前
此快照最后确认于
2025/12/03 07:59
3 个月前
查看原文

思路

发现 [0.5n,2n][0.5n, \, 2n] 的范围中,在 xx 很大时会包含很多数,所以考虑将一个区间的数用一个代表记下,这个范围的数在输出代表时均满足。
于是得到如下表格:
区间代表区间代表
[1,4][1, \, 4]22[87381,349524][87381, \, 349524]174762174762
[5,20][5, \, 20]1010[349525,1398100][349525, \, 1398100]699050699050
[21,84][21, \, 84]4242[1398101,5592404][1398101, \, 5592404]27962022796202
[85,340][85, \, 340]170170[5592405,22369260][5592405, \, 22369260]1118481011184810
[341,1364][341, \, 1364]682682[22369261,89478484][22369261, \, 89478484]4473924244739242
[1365,5460][1365, \, 5460]27302730[89478485,357913940][89478485, \, 357913940]178956970178956970
[5461,21844][5461, \, 21844]1092210922[357913941,1431655764][357913941, \, 1431655764]715827882715827882
[21845,87380][21845, \, 87380]4369043690[1431655765,5726623060][1431655765, \, 5726623060]28633115302863311530
事实上不看表格也行。
总之,设第 ii 个区间代表为 fif_i,那么 f1=2f_1 = 2fi=(2×fi1+1)×2f_i = (2 \times f_{i - 1} + 1) \times 2,对应区间为 [0.5fi,2fi][0.5f_i, \, 2f_i]
然后你发现刚好 1616 个区间,用二分刚好就能在 44 次询问内解决。
然后,就没有然后了。

思路

先预处理代表 fif_i,之后每一次测试二分。
CPP
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

ll c[20];
int T;

int main() {
	c[1] = 2;
	for (int i = 2 ; i <= 16 ; i++)
		c[i] = (c[i - 1] * 2 + 1) * 2;
	for (int i = 1 ; i <= 16 ; i++)
		printf("%lld %lld %lld\n", c[i] / 2, c[i], c[i] * 2);
	cin >> T;
	for (ll n ; T-- ; ) {
		cin >> n;
		int L = 1, R = 2;
		for (int i = 1 ; i <= 16 ; i++)
			if (c[i] * 2 < n) ++R;
		while (L < R - 1) {
			int mid = (L + R) >> 1, k;
			cout << "? " << c[mid] / 2 << endl;
			cin >> k;
			if (k) R = mid;
			else L = mid;
		}
		if (c[L] > n) cout << "! " << n << endl;
		else cout << "! " << c[L] << endl;
	}
	return 0;
}

评论

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

正在加载评论...