专栏文章
题解: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 个月前
思路
发现 的范围中,在 很大时会包含很多数,所以考虑将一个区间的数用一个代表记下,这个范围的数在输出代表时均满足。
于是得到如下表格:
| 区间 | 代表 | 区间 | 代表 |
|---|---|---|---|
总之,设第 个区间代表为 ,那么 ,,对应区间为 。
然后你发现刚好 个区间,用二分刚好就能在 次询问内解决。
然后,就没有然后了。
思路
先预处理代表 ,之后每一次测试二分。
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 条评论,欢迎与作者交流。
正在加载评论...