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