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` 会被视为答案错误。