QOJ.ac

QOJ

時間限制: 3 s 記憶體限制: 1024 MB 總分: 100 互動

#41. 蠕虫的烦恼

统计

你正在寻找一个土壤中的位置来放置你的宠物蠕虫 Maximus。你将搜索范围限制在一个尺寸为 $N \times M \times K$ 厘米的盒状区域内,该区域被划分为一个三维立方厘米网格,网格中的位置标记为 $(x, y, z)$(其中 $1 \le x \le N, 1 \le y \le M, 1 \le z \le K$)。每个单元格都有一定的湿度 $H[x, y, z]$,这是一个范围在 $1 \dots 10^9$ 之间的整数。你可以使用特殊的传感器测量任何单元格的湿度。

Maximus 喜欢潮湿的地方,因此你需要将它放在一个湿度至少不低于其相邻单元格的单元格中,否则它会离开,你将很难找到它。换句话说,你需要将 Maximus 放置在一个局部极大值点。更准确地说,你需要找到一个单元格 $(x, y, z)$,使得:

$$H[x, y, z] \ge \max(H[x + 1, y, z], H[x - 1, y, z], H[x, y + 1, z], H[x, y - 1, z], H[x, y, z + 1], H[x, y, z - 1])$$

其中,当坐标位于盒子外部时,对应的值视为 $0$(因为 Maximus 必须待在盒子内)。

然而,单元格的数量可能非常大,因此你不能测量所有单元格的湿度。因此,在本题中,你可以与交互器进行交互,询问给定点的湿度。当你找到适合 Maximus 的位置时,将该位置告知交互器。

交互

输入的第一行包含四个正整数:$N, M, K$ 和 $Q$,其中 $N, M, K$ 是盒子的尺寸,$Q$ 是你最多可以进行的测量次数。

之后,你可以向标准输出写入最多 $Q$ 行格式为 “? x y z” 的内容。这表示询问点 $(x, y, z)$ 的湿度值。对于每一行这样的询问,交互器将返回一行包含整数 $H[x, y, z]$ 的内容,你的程序可以从标准输入中读取该值。

在所有这些询问之后,你的程序必须写入恰好一行格式为 “! x y z” 的内容并终止。这表示点 $(x, y, z)$ 是根据上述标准适合 Maximus 的位置。交互器不会对该输出做出响应。

所有的 $x, y, z$ 值必须满足 $1 \le x \le N, 1 \le y \le M, 1 \le z \le K$。如果不满足,或者某一行格式无效,或者你询问的次数超过了 $Q$,交互器将返回 -1 并退出。如果发生这种情况,你的程序也应退出。如果程序继续运行,可能会错误地获得运行时错误(Runtime Error)或超出时间限制(Time Limit Exceeded)的判决。

你必须确保在读取交互器的响应之前刷新标准输出,否则你的程序可能会被判为超出时间限制。在支持的语言中,操作如下:

  • Java: System.out.println() 会自动刷新。
  • Python: print() 会自动刷新。
  • C++: cout << endl; 在写入换行符的同时会刷新。如果使用 printf,请使用 fflush(stdout)
  • Pascal: Flush(Output)

为了帮助处理交互,我们提供了可选的辅助代码,你可以将其复制到你的程序中。所有支持语言(C++、Pascal、Java、Python)的辅助代码链接可以在 Kattis 题目页面的侧边栏中找到。辅助代码还使用了快速输入/输出例程,这对于 Python 和 Java 可能很有用(仅对最后两组测试数据相关)。

交互器是非自适应的;也就是说,每个测试用例都有一组固定的湿度值,这些值不依赖于程序执行的测量。

子任务

你的解决方案将在多组测试数据上进行测试,每组测试数据都有一定的分值。每组测试数据包含多个测试用例。要获得某组测试数据的分数,你需要解决该组中的所有测试用例。你的最终得分为单次提交所获得的最高分数。

组别 分值 数据范围
1 10 $M = K = 1, N = 1\,000\,000, Q = 10\,000$
2 22 $M = K = 1, N = 1\,000\,000, Q = 35$
3 12 $K = 1, N = M = 200, Q = 4\,000$
4 19 $K = 1, N = M = 1\,000, Q = 3\,500$
5 14 $N = M = K = 100, Q = 100\,000$
6 23 $N = M = K = 500, Q = 150\,000$

样例

Kattis 上有一个样例测试用例。在这个样例中,盒子的尺寸为 $3 \times 1 \times 1$,三个单元格的湿度为 $\{10, 14, 13\}$。下面是一个交互示例,其中以 JUDGE 开头的行是 Kattis 的输出(即你程序的输入),以 YOU 开头的行是你程序的输出。

由于 14 确实大于或等于相邻值(10 和 13),因此位置 $(2, 1, 1)$ 是 Maximus 的合适位置,并且你使用了三次查询,这达到了允许的最大次数($Q = 3$)。因此,此交互在样例上会得到 Accepted。

JUDGE: 3 1 1 3
YOU: ? 3 1 1
JUDGE: 13
YOU: ? 2 1 1
JUDGE: 14
YOU: ? 1 1 1
JUDGE: 10
YOU: ! 2 1 1

输入格式 1

3 1 1 3 123123 fixed 10 14 13

输出格式 1

! 2 1 1

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.