P12531 [XJTUPC 2025] Beat Verdict: Precision Strike
题目描述
**这是一道交互题。**
你正在玩一款名为「乌蒙滴叉」的音乐游戏。在专家模式中,需要精确校准音符的击打时机参数,该参数是一个 $[1,n]$ 内的神秘正整数 $x$。
为了确定这个参数,你可以进行至多 $4$ 次校准测试。每次测试时,你选择一个正整数测试值 $y$ ($1 \le y \le n$),系统将告知你 $y > x$ 是否成立。最终你需要给出一个正整数参数估计值 $x'$ ($1 \le x' \le n$),且满足 $x' \in \left[0.5x, 2x\right]$。
注意:最终给出的估计值 $x'$ 不计入上述至多 $4$ 次测试次数。
输入格式
输入包含多个测试用例。数据的第一行包含一个整数 $t$ ($1\le t\le 500$) 表示测试用例数。每个测试用例的交互流程在下文中描述。
在每个测试用例中,输入的第一行包含一个正整数 $n$ ($1\le n \le 5 \times 10^9$),表示参数的可能范围。
若你想进行测试,输出 `? y` ($1 \le y \le n$)。然后你读入对该测试的响应,为一个整数 $a$ ($a \in \{0, 1\}$),$\tt{1}$ 表示 $y>x$ 为真,$\tt{0}$ 表示 $y>x$ 为假。
若你想提交参数 $x'$,输出 `! x'` ($1 \le x' \le n$)。然后你立即结束本个测试用例的交互,并准备下一个测试用例的交互。这次交互不计入上述至多 $4$ 次测试次数。
注意在你的程序每轮输出结束时(即,每一次输出 `? y` 或 `! x'` 后),**需要输出回车并刷新输出缓冲区**,否则你将会得到 $\tt{Time\ Limit\ Exceeded}$。
你可以使用:
- C 的 `fflush(stdout)`;
- C++ 的 `cout.flush()`;
- Java 的 `System.out.flush()`;
- Python 的 `stdout.flush()`;
来刷新输出缓冲区。
请注意:交互库自适应,即每个测试用例中的正整数 $x$ ($1 \le x \le n$) **可能会随着你的输入而变化**,但始终满足所有已经发生过的询问。
如果你最后输出的答案正确,你会得到 $\tt{Accepted}$;
如果你给出的询问不符合题目范围要求,或最后输出的答案不正确,你会得到 $\tt{Wrong\ Answer}$;
此外,其他的评测结果仍会在评测过程中根据通常情况返回。
输出格式
见输入格式。
说明/提示
在第一组测试用例中,可以唯一确定 $x = 1$,因此我们直接提交 $x' = 1$。
在第二组测试用例中,隐藏的参数 $x = 3$,交互过程如下:
- 测试 $y=6$,响应为 $y>x$ 为真;
- 测试 $y=4$,响应为 $y>x$ 为真;
- 测试 $y=2$,响应为 $y>x$ 为假;
- 测试 $y=3$,响应为 $y>x$ 为假;
- 提交 $x' = 3$。
请注意,此示例仅用于演示交互格式。不能保证提供的查询是最优的或唯一确定答案。