#P13057. [GCJ 2020 #1B] Blindfolded Bullseye

    ID: 12900 远端评测题 30000ms 1024MiB 尝试: 0 已通过: 0 难度: 7 上传者: 标签>计算几何2020二分交互题Special Judge概率论Google Code Jam

[GCJ 2020 #1B] Blindfolded Bullseye

Description

Gary 有一面巨大的正方形墙,高度和宽度均为 2×1092 \times 10^{9} 纳米。Gary 在墙上放置了一个圆形飞镖靶。飞镖靶的半径 RR 介于 A\mathbf{A}B\mathbf{B} 纳米之间(含端点),且完全位于墙内(允许接触边缘)。飞镖靶的中心与墙的每条边的距离均为整数纳米。

Gary 邀请了他的朋友 Mika 来玩一个有趣的游戏。Gary 蒙住 Mika 的眼睛,并挑战她向飞镖靶的中心投掷飞镖。为了帮助她,每当 Mika 向墙上投掷飞镖时,Gary 会告诉她飞镖是否击中了飞镖靶。

Mika 不知道飞镖靶在墙上的具体位置,但由于她投掷飞镖的技术非常高超,可以精确到纳米级别。也就是说,她可以瞄准并击中墙上任意一个与边缘距离为整数纳米的点。每次投掷后,Gary 会立即告诉她是否击中了飞镖靶的中心、飞镖靶的其他部分,或者完全未击中飞镖靶(即击中墙面)。

你能帮助 Mika 在不超过 300 次投掷的情况下击中飞镖靶的中心吗?

交互协议

初始时,你的程序应读取一行,包含三个整数 T\mathbf{T}A\mathbf{A}B\mathbf{B},分别表示测试用例的数量以及飞镖靶半径的最小值和最大值(单位为纳米)。(注意,A\mathbf{A}B\mathbf{B} 在同一测试集中对所有测试用例相同。)然后,你需要处理 T\mathbf{T} 个测试用例。

我们将可投掷的点表示为 (x,y)(x, y),其中 xxyy 是介于 109-10^{9}10910^{9} 之间的整数。点 (x,y)(x, y) 表示该点距离墙的左边缘 x+109x + 10^{9} 纳米,距离墙的底边缘 y+109y + 10^{9} 纳米。因此,点 (0,0)(0, 0) 位于墙的正中心。

对于每个测试用例,裁判会秘密选择一个飞镖靶的半径 RR 和中心 (X,Y)(X, Y)RRXXYY 是裁判为每个测试用例设计的整数(非随机),且满足题目限制。对于每个测试用例,你最多可以与裁判进行 300 次交互。你的程序代表 Mika,裁判程序代表 Gary。每次交互包含以下步骤:

  1. 你的程序输出一行,包含两个整数 XiX_{i}YiY_{i}(均在 109-10^{9}10910^{9} 之间),表示投掷的坐标。
  2. 裁判会响应一行,内容为以下之一:
    • CENTER:如果 Xi=XX_{i} = XYi=YY_{i} = Y(即击中中心)。
    • HIT:如果 0<(XXi)2+(YYi)2R20 < (X - X_{i})^{2} + (Y - Y_{i})^{2} \leq R^{2}(即击中飞镖靶但未击中中心)。
    • MISS:其他情况(未击中飞镖靶)。

当裁判返回 CENTER 后,它会开始等待下一个测试用例的交互(如果有)。

如果你的输出格式错误或超出范围,裁判会返回 WRONG。如果在 300 次交互内未收到 CENTER,或者收到 WRONG,裁判会终止通信并判定为错误答案。如果成功在第 TT 个测试用例返回 CENTER,裁判会终止通信并判定为正确。如果程序超时或内存超限,会相应判定。

Input Format

参见交互协议。

Output Format

参见交互协议。



Hint

样例解释

以下是一个使用测试集 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 // 退出以避免超时错误

你可以使用交互测试工具在本地或平台上测试。工具的使用说明包含在注释中。请注意,该工具并非真实裁判系统,行为可能有所不同。

数据范围

  • 1T201 \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 分,可见判定)

  • A=B=1095\mathbf{A} = \mathbf{B} = 10^{9} - 5

测试集 2(12 分,可见判定)

  • A=B=10950\mathbf{A} = \mathbf{B} = 10^{9} - 50

测试集 3(19 分,隐藏判定)

  • A=109/2\mathbf{A} = 10^{9} / 2
  • B=109\mathbf{B} = 10^{9}

翻译由 DeepSeek V3 完成