小 Krotka 和她的哥哥 Entek 是一个 $d$ 维世界中的居民。今天他们决定玩捉迷藏——Entek 先找。由于在高维世界中寻找目标并非易事,为了方便起见,他们决定通过对讲机进行交流。此外,他们每个人都随身携带了一个 GPS 接收器。
Krotka 躲在超立方体森林中的某个格点(即所有坐标均为整数的点)上,并且在游戏结束前不会移动。正如其名,森林是一个边长为 $r$ 的超立方体——其中包含所有坐标在区间 $[0, r]$ 内的点。Entek 在寻找妹妹的过程中在森林中移动,并不时地向她报告自己从 GPS 读取到的位置。我们假设 Entek 在报告位置时总是位于格点上。
在报告位置后,Entek 会收到 Krotka 发来的“热”或“冷”的消息——Krotka 会告诉他,与上一次联系的位置相比,他是否更靠近她的位置。
对于给定的 $d$ 维点 $p, x, y$,Krotka 认为点 $x$ 比点 $y$ 更靠近点 $p$,当且仅当: $$\max_{i=1,2,...,d} |x_i - p_i| < \max_{i=1,2,...,d} |y_i - p_i|$$
Entek 的对讲机电池容量有限,最多允许他进行 $k$ 次连接。请帮他找到妹妹,以免失去联系。
交互
Krotka 躲在一个所有坐标均为整数且属于区间 $[0, r]$ 的 $d$ 维点上。在游戏过程中,Krotka 会如实回答,且不会移动。
你的程序应使用提供的库来模拟 Krotka 的回答。若要在 C 或 C++ 编写的解决方案中使用该库,请在程序中包含:
#include "cielib.h"
对于 Java 解决方案,库将被自动包含,无需在源文件中添加额外行。
与库的交互通过以下函数进行:
int podajD()– 返回世界维度,即上述的 $d$。int podajK()– 返回可能的czyCieplo询问次数,即上述的 $k$。int podajR()– 返回超立方体森林的边长,即上述的 $r$。int czyCieplo(int pozycja[])–pozycja必须是一个包含 $d$ 个整数的数组,且每个整数都在区间 $[0, r]$ 内,表示 Entek 当前的位置。该函数总是返回 0 或 1。在程序运行期间,最多可以调用该函数 $k$ 次。第一次调用时,函数返回 0。在随后的每次调用中,当且仅当 Entek 当前位置比上一次调用时的位置更靠近 Krotka 的位置时,函数返回 1。void znalazlem(int pozycja[])–pozycja必须是一个包含 $d$ 个整数的数组,且每个整数都在区间 $[0, r]$ 内,表示找到的 Krotka 的位置。该函数必须且仅能调用一次,调用后程序将结束。
对于 C 和 C++,这些是全局函数;对于 Java,这些是 cielib 类的静态方法(即调用方式为 cielib.podajD() 等)。
你的程序不得打开任何文件,也不得使用标准输入输出。解决方案将通过以下命令与库一起编译:
- C:
gcc -std=c11 -static -O2 -s cielib.c cie.c -lm - C++:
g++ -std=c++11 -static -O2 -s cielib.c cie.cpp -lm - Java:
javac cie.javajar cf cie.jar *.class
在“文件”部分,你可以找到示例库文件和说明其使用方法的错误解决方案。为了使上述编译命令生效,库文件必须位于当前目录中。
数据范围
在所有测试中,满足 $2 \le r \le 10^9$,$1 \le d \le 500$ 以及 $k \ge 100d$。
子任务
如果你的程序在最多 $k$ 次调用 czyCieplo 函数后,调用了 znalazlem 并给出了正确的 Krotka 位置,则该测试点得满分。如果程序错误地使用库(调用函数时参数不符合“交互”部分的规定,或使用了标准输入输出),则该测试点得 0 分。
样例
| 函数调用 | 返回值 |
|---|---|
podajD() |
2 |
podajK() |
200 |
podajR() |
2 |
czyCieplo({0, 0}) |
0 |
czyCieplo({1, 1}) |
1 |
czyCieplo({2, 2}) |
1 |
znalazlem({2, 2}) |
程序成功结束 |