P13057 [GCJ 2020 #1B] Blindfolded Bullseye
题目描述
Gary 有一面巨大的正方形墙,高度和宽度均为 $2 \times 10^{9}$ 纳米。Gary 在墙上放置了一个圆形飞镖靶。飞镖靶的半径 $R$ 介于 $\mathbf{A}$ 和 $\mathbf{B}$ 纳米之间(含端点),且完全位于墙内(允许接触边缘)。飞镖靶的中心与墙的每条边的距离均为整数纳米。
Gary 邀请了他的朋友 Mika 来玩一个有趣的游戏。Gary 蒙住 Mika 的眼睛,并挑战她向飞镖靶的中心投掷飞镖。为了帮助她,每当 Mika 向墙上投掷飞镖时,Gary 会告诉她飞镖是否击中了飞镖靶。
Mika 不知道飞镖靶在墙上的具体位置,但由于她投掷飞镖的技术非常高超,可以精确到纳米级别。也就是说,她可以瞄准并击中墙上任意一个与边缘距离为整数纳米的点。每次投掷后,Gary 会立即告诉她是否击中了飞镖靶的中心、飞镖靶的其他部分,或者完全未击中飞镖靶(即击中墙面)。
你能帮助 Mika 在不超过 300 次投掷的情况下击中飞镖靶的中心吗?
### 交互协议
初始时,你的程序应读取一行,包含三个整数 $\mathbf{T}$、$\mathbf{A}$ 和 $\mathbf{B}$,分别表示测试用例的数量以及飞镖靶半径的最小值和最大值(单位为纳米)。(注意,$\mathbf{A}$ 和 $\mathbf{B}$ 在同一测试集中对所有测试用例相同。)然后,你需要处理 $\mathbf{T}$ 个测试用例。
我们将可投掷的点表示为 $(x, y)$,其中 $x$ 和 $y$ 是介于 $-10^{9}$ 和 $10^{9}$ 之间的整数。点 $(x, y)$ 表示该点距离墙的左边缘 $x + 10^{9}$ 纳米,距离墙的底边缘 $y + 10^{9}$ 纳米。因此,点 $(0, 0)$ 位于墙的正中心。
对于每个测试用例,裁判会秘密选择一个飞镖靶的半径 $R$ 和中心 $(X, Y)$。$R$、$X$ 和 $Y$ 是裁判为每个测试用例设计的整数(非随机),且满足题目限制。对于每个测试用例,你最多可以与裁判进行 300 次交互。你的程序代表 Mika,裁判程序代表 Gary。每次交互包含以下步骤:
1. 你的程序输出一行,包含两个整数 $X_{i}$ 和 $Y_{i}$(均在 $-10^{9}$ 到 $10^{9}$ 之间),表示投掷的坐标。
2. 裁判会响应一行,内容为以下之一:
- `CENTER`:如果 $X_{i} = X$ 且 $Y_{i} = Y$(即击中中心)。
- `HIT`:如果 $0 < (X - X_{i})^{2} + (Y - Y_{i})^{2} \leq R^{2}$(即击中飞镖靶但未击中中心)。
- `MISS`:其他情况(未击中飞镖靶)。
当裁判返回 `CENTER` 后,它会开始等待下一个测试用例的交互(如果有)。
如果你的输出格式错误或超出范围,裁判会返回 `WRONG`。如果在 300 次交互内未收到 `CENTER`,或者收到 `WRONG`,裁判会终止通信并判定为错误答案。如果成功在第 $T$ 个测试用例返回 `CENTER`,裁判会终止通信并判定为正确。如果程序超时或内存超限,会相应判定。
输入格式
参见交互协议。
输出格式
参见交互协议。
说明/提示
**样例解释**
以下是一个使用测试集 1 限制的样例交互:
```
// 读取 t = 20, a = 999999995, b = 999999995
t, a, b = readline_int_list()
// 裁判秘密选择 R = 999999995 和 X = -1, Y = 3
// 尝试投掷到墙的左上角,未击中飞镖靶
printline -1000000000 1000000000 to stdout
flush stdout
r = readline_string() // 返回 MISS
// 尝试投掷到墙的中心,击中飞镖靶但未击中中心
printline 0 0 to stdout
flush stdout
r = readline_string() // 返回 HIT
// 幸运地直接投掷到飞镖靶中心
printline -1 3 to stdout
flush stdout
r = readline_string() // 返回 CENTER
// 裁判开始下一个测试用例,选择 R = 999999995, X = 5, Y = 5
// 尝试投掷超出允许范围
printline -1234567890 1234567890 to stdout
flush stdout
r = readline_string() // 返回 WRONG
exit // 退出以避免超时错误
```
你可以使用[交互测试工具](https://storage.googleapis.com/coding-competitions.appspot.com/interactive_runner.py)在本地或平台上测试。工具的使用说明包含在注释中。请注意,该工具并非真实裁判系统,行为可能有所不同。
**数据范围**
- $1 \leqslant \mathbf{T} \leqslant 20$。
- $\mathbf{A} \leqslant \mathbf{R} \leqslant \mathbf{B}$。
- $-10^{9} + \mathbf{R} \leqslant \mathbf{X} \leqslant 10^{9} - \mathbf{R}$。
- $-10^{9} + \mathbf{R} \leqslant \mathbf{Y} \leqslant 10^{9} - \mathbf{R}$。
**测试集 1(3 分,可见判定)**
- $\mathbf{A} = \mathbf{B} = 10^{9} - 5$。
**测试集 2(12 分,可见判定)**
- $\mathbf{A} = \mathbf{B} = 10^{9} - 50$。
**测试集 3(19 分,隐藏判定)**
- $\mathbf{A} = 10^{9} / 2$。
- $\mathbf{B} = 10^{9}$。
翻译由 DeepSeek V3 完成