P16215 [ECUSTPC 2025] 化方为圆
题目描述
这是一道交互题。
Maddy 和 Buddy 在玩猜机关的游戏!
机关是一个二维图形,Maddy 现在在二维坐标平面内隐藏了一个机关,这个机关可能是下面两种中的一种:
- 弹球,这是一个格点圆,其圆心位于 $(0, 0)$,圆上有至少一个正格点(至少一个横纵坐标为正整数的点),且其横纵坐标绝对值小于 $10^5$。
- Kevin,这是一个格点正方形,其中心位于 $(0, 0)$,每个顶点都在格点上(横纵坐标为整数),且其横纵坐标绝对值小于 $10^5$,保证正方形不是退化的,也即其边长不小于 1。
但 Buddy 不知道这个机关是什么,她可以每次询问 Maddy 一个问题:
- 格点 $(x, y)$ 是否在这个机关所表示的图形之外(边界算在图形内部)?
- Maddy 会告诉她这个点在图形之外或是在图形之内,如果点在边界上,Maddy 会告诉 Buddy 点在图形内部。
Buddy 可以至多问 35 次问题,她需要告诉 Maddy:
- 这个机关是 Kevin,弹球,还是存在两种可能的答案?
注意,回答你的答案不算在 35 次询问之内。
### 交互格式
第一行输入一个整数 $T$ ($1 \le T \le 10^3$),表示测试数据的数量。
每组数据会直接开始交互过程,每一次交互你可以以下面的格式向交互器询问问题:
- 输出一行,首先输出一个字符 `?` 表示你询问一次,随后输出两个整数 $x$ 和 $y$ 表示你需要询问点 $(x, y)$ 是否在机关外,你需要保证 $0 \le |x|, |y| \le 2 \times 10^5$。
- 若你的输入合法并且没有超出询问限制,交互器会给出一行一个字符串 $Q$,若 $Q = \text{IN}$,则表示 $(x, y)$ 在机关所表示的图形之内或在边上;若 $Q = \text{OUT}$ 则表示 $(x, y)$ 在机关所表示的图形外部。
- 若你询问的问题超出了对应的询问次数限制,交互器会输出一个整数 $-1$ 并结束你的交互进程,此时你会获得答案错误的评测结果。
若你已经得到答案的话,请按照以下的格式输出答案:
- 输出一行,首先输出一个字符 `!`。
- 随后输出一个字符串 $S$,$S$ 需为 `Bumper`、`Kevin` 或 `NotConfirm`,分别表示机关是弹球,机关是 Kevin,或存在两种可能的答案。
若你的答案正确则交互器会输出一行一个字符串 `Correct!`,反之则会输出一行一个整数 $-2$ 并立即结束,此时你会获得答案错误的评测结果。
在完成一组交互之后你应该立刻开始下一组交互的询问,若已是最后一组数据你可以安全退出。
交互不是自适应的,这意味着着在每组数据开始之前机关就已经确定,在交互过程中不会改变。
每次输出都需要输出换行并且刷新缓冲区,否则你可能会得到意料之外的结果。
如果接收到了 $-1$ 或 $-2$ 两种交互器的错误信息,请尽快结束你的交互进程,否则你可能会得到意料之外的结果(如超时)。
为了刷新缓冲区,你可以:
- 对于 C 或者 C++,使用 `fflush(stdout)` 或 `cout.flush()`。
- 对于 Java 或 Kotlin,使用 `System.out.flush()`。
- 对于 Python,使用 `stdout.flush()`。
输入格式
无
输出格式
无
说明/提示
### 提示
请注意样例中的交互过程仅供参考,实际交互过程并不唯一,且这一示例的交互过程不一定是可行的或是最优的,本题的样例不会在附加文件中出现。
存在两种可能的答案当且仅当:
- 存在一个 Kevin 形状 $K$ 覆盖的格点集合 $S_K$ 和一个弹球形状 $B$ 覆盖的格点集合 $S_B$ 和当前我们隐藏机关的格点集合 $S_{\text{hidden}}$ 完全相同。
这时候你不可能通过你的询问区分两种形状,你应该输出 `NotConfirm`。
但是如果不存在这样的一对机关使得覆盖集合相同,那你应该可以用你的询问唯一确定机关种类,这时输出 `NotConfirm` 会被视为答案错误。