#P16215. [ECUSTPC 2025] 化方为圆
[ECUSTPC 2025] 化方为圆
题目描述
这是一道交互题。
Maddy 和 Buddy 在玩猜机关的游戏!
机关是一个二维图形,Maddy 现在在二维坐标平面内隐藏了一个机关,这个机关可能是下面两种中的一种:
- 弹球,这是一个格点圆,其圆心位于 ,圆上有至少一个正格点(至少一个横纵坐标为正整数的点),且其横纵坐标绝对值小于 。
- Kevin,这是一个格点正方形,其中心位于 ,每个顶点都在格点上(横纵坐标为整数),且其横纵坐标绝对值小于 ,保证正方形不是退化的,也即其边长不小于 1。
但 Buddy 不知道这个机关是什么,她可以每次询问 Maddy 一个问题:
- 格点 是否在这个机关所表示的图形之外(边界算在图形内部)?
- Maddy 会告诉她这个点在图形之外或是在图形之内,如果点在边界上,Maddy 会告诉 Buddy 点在图形内部。
Buddy 可以至多问 35 次问题,她需要告诉 Maddy:
- 这个机关是 Kevin,弹球,还是存在两种可能的答案?
注意,回答你的答案不算在 35 次询问之内。
交互格式
第一行输入一个整数 (),表示测试数据的数量。
每组数据会直接开始交互过程,每一次交互你可以以下面的格式向交互器询问问题:
- 输出一行,首先输出一个字符
?表示你询问一次,随后输出两个整数 和 表示你需要询问点 是否在机关外,你需要保证 。 - 若你的输入合法并且没有超出询问限制,交互器会给出一行一个字符串 ,若 ,则表示 在机关所表示的图形之内或在边上;若 则表示 在机关所表示的图形外部。
- 若你询问的问题超出了对应的询问次数限制,交互器会输出一个整数 并结束你的交互进程,此时你会获得答案错误的评测结果。
若你已经得到答案的话,请按照以下的格式输出答案:
- 输出一行,首先输出一个字符
!。 - 随后输出一个字符串 , 需为
Bumper、Kevin或NotConfirm,分别表示机关是弹球,机关是 Kevin,或存在两种可能的答案。
若你的答案正确则交互器会输出一行一个字符串 Correct!,反之则会输出一行一个整数 并立即结束,此时你会获得答案错误的评测结果。
在完成一组交互之后你应该立刻开始下一组交互的询问,若已是最后一组数据你可以安全退出。
交互不是自适应的,这意味着着在每组数据开始之前机关就已经确定,在交互过程中不会改变。
每次输出都需要输出换行并且刷新缓冲区,否则你可能会得到意料之外的结果。
如果接收到了 或 两种交互器的错误信息,请尽快结束你的交互进程,否则你可能会得到意料之外的结果(如超时)。
为了刷新缓冲区,你可以:
- 对于 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 形状 覆盖的格点集合 和一个弹球形状 覆盖的格点集合 和当前我们隐藏机关的格点集合 完全相同。
这时候你不可能通过你的询问区分两种形状,你应该输出 NotConfirm。
但是如果不存在这样的一对机关使得覆盖集合相同,那你应该可以用你的询问唯一确定机关种类,这时输出 NotConfirm 会被视为答案错误。