P17658 [IO 2025 #3] 逃离僵尸
题目背景
**这是一道交互题。**
题目描述
众所周知,奈落学院里住着僵尸,它们在学院的区域中行走。学院的区域可以看作一个笛卡尔平面。僵尸是死去的生物,因此行动迟缓,头脑也不灵光。它们只能沿着平行于坐标轴的方向移动,沿某个方向移动距离 $d$ 需要 $d^2$ 秒,其中 $d$ 必须是整数。注意,每次移动距离 $d$ 后,僵尸必须改变移动方向,否则就会发疯。
例如,下面是一条合法的僵尸路径:
$$
(0,0)\to(2,0)\to(2,1)\to(-1,1)\to(-1,-1)\to(0,-1).
$$
僵尸走完这条路径需要 $2^2+1^2+3^2+2^2+1^2=19$ 秒。
到达同一点的不同路线可能需要不同的时间。令 $f(x,y)$ 表示僵尸从 $(x,y)$ 到达 $(0,0)$ 所需的最短时间。不幸的是,僵尸已经学会了按最短时间行走。
你决定考验自己的机智和辨认方向的能力。星期三非常了解僵尸的习性,她同意和你玩下面的游戏。
星期三在平面上选定一个整数坐标点 $(x_0,y_0)$,并把僵尸放在那里。之后,你可以向她提出以下询问:
- `? Δx Δy`:星期三把僵尸沿向量 $(\Delta x,\Delta y)$ 移动,然后告诉你移动后相对于移动前的最短时间变化。也就是说,如果移动前僵尸的坐标为 $(x,y)$,她会回答 $f(x+\Delta x,y+\Delta y)-f(x,y)$。询问结束后,僵尸停留在移动后的坐标。
当然,星期三并非无缘无故答应和你玩这个游戏:你必须猜出她选定的点,否则她就把你喂给僵尸。
### 交互协议
交互通过程序输出询问、交互器返回回答的方式进行。你最多可以进行 $100$ 次上述移动操作。程序开始时没有需要读取的普通输入。
要移动点,请输出一行 `? Δx Δy`,其中 $|\Delta x|,|\Delta y|\le2\cdot10^9$。交互器会在单独一行返回星期三的回答。
要报告答案,请输出一行 `! x y`。这里的 $x,y$ 必须是点的**当前坐标**。报告答案不计入询问次数。之后,交互器会返回一个判定:猜测正确时返回 `You win`,否则返回 `Your brains will be eaten`。答案错误时,你的程序将得到 WA,交互器也会结束;为了避免得到不正确的判定,程序在读到错误判定后也应立即结束。
保证星期三最初选定的点具有整数坐标,且 $|x_0|,|y_0|\le10^9$。
如果询问次数超过 $100$,程序将得到 WA。如果某次移动后点的任一坐标的绝对值超过 $8\cdot10^9$,交互器会回答 $-1$,程序将得到 WA。
**每输出一行后都必须刷新输出缓冲区**,否则交互器无法收到询问,程序可能得到 TL 或 IL。C++ 可以使用 `std::cout.flush()`,Java 可以使用 `System.out.flush()`,Python 可以使用 `sys.stdout.flush()`。
输入格式
无
输出格式
无
说明/提示
在第一个样例中,最初选定的点为 $(1,2)$,询问后它按以下路径移动:
$$
(1,2)\to(3,1)\to(1,1)\to(0,2)\to(1,2).
$$
这些位置对应的最短时间依次为 $3,6,2,4,3$,所以四次询问的回答分别为 $3,-4,2,-1$。最终点的坐标为 $(1,2)$,程序报告的答案正确。