33OJ
登录 注册

#P17658. [IO 2025 #3] 逃离僵尸

    ID: 20306 远端评测题 1000ms 512MiB 尝试: 0 已通过: 0 显示难度普及+/提高− 上传者: 标签>数学2025交互题Special Judge

[IO 2025 #3] 逃离僵尸

背景

这是一道交互题。

题目描述

众所周知,奈落学院里住着僵尸,它们在学院的区域中行走。学院的区域可以看作一个笛卡尔平面。僵尸是死去的生物,因此行动迟缓,头脑也不灵光。它们只能沿着平行于坐标轴的方向移动,沿某个方向移动距离 dd 需要 d2d^2 秒,其中 dd 必须是整数。注意,每次移动距离 dd 后,僵尸必须改变移动方向,否则就会发疯。

例如,下面是一条合法的僵尸路径:

$$(0,0)\to(2,0)\to(2,1)\to(-1,1)\to(-1,-1)\to(0,-1).$$

僵尸走完这条路径需要 22+12+32+22+12=192^2+1^2+3^2+2^2+1^2=19 秒。

到达同一点的不同路线可能需要不同的时间。令 f(x,y)f(x,y) 表示僵尸从 (x,y)(x,y) 到达 (0,0)(0,0) 所需的最短时间。不幸的是,僵尸已经学会了按最短时间行走。

你决定考验自己的机智和辨认方向的能力。星期三非常了解僵尸的习性,她同意和你玩下面的游戏。

星期三在平面上选定一个整数坐标点 (x0,y0)(x_0,y_0),并把僵尸放在那里。之后,你可以向她提出以下询问:

  • ? Δx Δy:星期三把僵尸沿向量 (Δx,Δy)(\Delta x,\Delta y) 移动,然后告诉你移动后相对于移动前的最短时间变化。也就是说,如果移动前僵尸的坐标为 (x,y)(x,y),她会回答 f(x+Δx,y+Δy)−f(x,y)f(x+\Delta x,y+\Delta y)-f(x,y)。询问结束后,僵尸停留在移动后的坐标。

当然,星期三并非无缘无故答应和你玩这个游戏:你必须猜出她选定的点,否则她就把你喂给僵尸。

交互协议

交互通过程序输出询问、交互器返回回答的方式进行。你最多可以进行 100100 次上述移动操作。程序开始时没有需要读取的普通输入。

要移动点,请输出一行 ? Δx Δy,其中 ∣Δx∣,∣Δy∣≤2⋅109|\Delta x|,|\Delta y|\le2\cdot10^9。交互器会在单独一行返回星期三的回答。

要报告答案,请输出一行 ! x y。这里的 x,yx,y 必须是点的当前坐标。报告答案不计入询问次数。之后,交互器会返回一个判定:猜测正确时返回 You win,否则返回 Your brains will be eaten。答案错误时,你的程序将得到 WA,交互器也会结束;为了避免得到不正确的判定,程序在读到错误判定后也应立即结束。

保证星期三最初选定的点具有整数坐标,且 ∣x0∣,∣y0∣≤109|x_0|,|y_0|\le10^9。

如果询问次数超过 100100,程序将得到 WA。如果某次移动后点的任一坐标的绝对值超过 8⋅1098\cdot10^9,交互器会回答 −1-1,程序将得到 WA。

每输出一行后都必须刷新输出缓冲区,否则交互器无法收到询问,程序可能得到 TL 或 IL。C++ 可以使用 std::cout.flush(),Java 可以使用 System.out.flush(),Python 可以使用 sys.stdout.flush()。

? 2 -1

? -2 0

? -1 1

? 1 0

! 1 2

3

-4

2

-1

You win

提示

在第一个样例中,最初选定的点为 (1,2)(1,2),询问后它按以下路径移动:

(1,2)→(3,1)→(1,1)→(0,2)→(1,2).(1,2)\to(3,1)\to(1,1)\to(0,2)\to(1,2).

这些位置对应的最短时间依次为 3,6,2,4,33,6,2,4,3,所以四次询问的回答分别为 3,−4,2,−13,-4,2,-1。最终点的坐标为 (1,2)(1,2),程序报告的答案正确。