#P16215. [ECUSTPC 2025] 化方为圆

[ECUSTPC 2025] 化方为圆

题目描述

这是一道交互题。

Maddy 和 Buddy 在玩猜机关的游戏!
机关是一个二维图形,Maddy 现在在二维坐标平面内隐藏了一个机关,这个机关可能是下面两种中的一种:

  • 弹球,这是一个格点圆,其圆心位于 (0,0)(0, 0),圆上有至少一个正格点(至少一个横纵坐标为正整数的点),且其横纵坐标绝对值小于 10510^5
  • Kevin,这是一个格点正方形,其中心位于 (0,0)(0, 0),每个顶点都在格点上(横纵坐标为整数),且其横纵坐标绝对值小于 10510^5,保证正方形不是退化的,也即其边长不小于 1。

但 Buddy 不知道这个机关是什么,她可以每次询问 Maddy 一个问题:

  • 格点 (x,y)(x, y) 是否在这个机关所表示的图形之外(边界算在图形内部)?
  • Maddy 会告诉她这个点在图形之外或是在图形之内,如果点在边界上,Maddy 会告诉 Buddy 点在图形内部。

Buddy 可以至多问 35 次问题,她需要告诉 Maddy:

  • 这个机关是 Kevin,弹球,还是存在两种可能的答案?

注意,回答你的答案不算在 35 次询问之内。

交互格式

第一行输入一个整数 TT (1T1031 \le T \le 10^3),表示测试数据的数量。
每组数据会直接开始交互过程,每一次交互你可以以下面的格式向交互器询问问题:

  • 输出一行,首先输出一个字符 ? 表示你询问一次,随后输出两个整数 xxyy 表示你需要询问点 (x,y)(x, y) 是否在机关外,你需要保证 0x,y2×1050 \le |x|, |y| \le 2 \times 10^5
  • 若你的输入合法并且没有超出询问限制,交互器会给出一行一个字符串 QQ,若 Q=INQ = \text{IN},则表示 (x,y)(x, y) 在机关所表示的图形之内或在边上;若 Q=OUTQ = \text{OUT} 则表示 (x,y)(x, y) 在机关所表示的图形外部。
  • 若你询问的问题超出了对应的询问次数限制,交互器会输出一个整数 1-1 并结束你的交互进程,此时你会获得答案错误的评测结果。

若你已经得到答案的话,请按照以下的格式输出答案:

  • 输出一行,首先输出一个字符 !
  • 随后输出一个字符串 SSSS 需为 BumperKevinNotConfirm,分别表示机关是弹球,机关是 Kevin,或存在两种可能的答案。

若你的答案正确则交互器会输出一行一个字符串 Correct!,反之则会输出一行一个整数 2-2 并立即结束,此时你会获得答案错误的评测结果。
在完成一组交互之后你应该立刻开始下一组交互的询问,若已是最后一组数据你可以安全退出。
交互不是自适应的,这意味着着在每组数据开始之前机关就已经确定,在交互过程中不会改变。
每次输出都需要输出换行并且刷新缓冲区,否则你可能会得到意料之外的结果。
如果接收到了 1-12-2 两种交互器的错误信息,请尽快结束你的交互进程,否则你可能会得到意料之外的结果(如超时)。
为了刷新缓冲区,你可以:

  • 对于 C 或者 C++,使用 fflush(stdout)cout.flush()
  • 对于 Java 或 Kotlin,使用 System.out.flush()
  • 对于 Python,使用 stdout.flush()
1
IN
IN
OUT
IN
Correct!
? 1 0
? 0 1
? 100 100
? 0 2
! Bumper

提示

提示

请注意样例中的交互过程仅供参考,实际交互过程并不唯一,且这一示例的交互过程不一定是可行的或是最优的,本题的样例不会在附加文件中出现。
存在两种可能的答案当且仅当:

  • 存在一个 Kevin 形状 KK 覆盖的格点集合 SKS_K 和一个弹球形状 BB 覆盖的格点集合 SBS_B 和当前我们隐藏机关的格点集合 ShiddenS_{\text{hidden}} 完全相同。

这时候你不可能通过你的询问区分两种形状,你应该输出 NotConfirm
但是如果不存在这样的一对机关使得覆盖集合相同,那你应该可以用你的询问唯一确定机关种类,这时输出 NotConfirm 会被视为答案错误。