趣题 Camping 做题笔记

Published on

清晰版

题意

注意,所有的 $h_{i, j}$ 都不会重复

稍微提高点难度吧,询问次数限制改为 $5n$。

题解

首先有一个一定能找到相对高地的方法(此处取名“蛇形法”,至于为什么,往下看就知道了):
随机一个点,寻问四周,向最高的点移动,直到四周都比它低。

<此处应有 $30$ 秒思考,你需要知道它为什么是对的,又需要知道它在什么情况下会超出询问次数>

查看答案

考虑一下这个 $5n$ 是怎么出来的。大概就是个分治。于是每次把 $n \times n$ 的大矩阵切成四个 $\dfrac n2 \times \dfrac n2$ 的小矩阵。我们的任务是通过几次询问操作来确定那个 $\dfrac14$ 小矩阵一定有相对高地

首先,显然想到的是询问一个“十”字框:

然后找到框上最大的一个点,看它剩下的两个方向(有两个方向在框上,已经确定比它低了)的高度,如果都比它低,此点既是相对高地。否则,高的一边所在的 $\dfrac14$ 小矩阵一定有相对高地(此时回想一下之前那个“蛇形法”,你应该就能理解这个为什么是对的了)。

现在告诉你,目前为止是对的,但如果继续用这个方法找答案就不对了。

<此处应有较长时间的思考,你需要知道它为什么第二次走的时候就有可能出错了,这是此题的关键之一>

查看答案
想出来了?没想出来建议你再想一想。
展开答案

越红代表越高。请模拟一边算法流程,如果你不懂,建议停下思考或重新阅读本文。

<此处应有 $30$ 秒思考,你需要想想如何解决这个问题>

解决方法
询问“田”字而不是“十”字。

询问复杂度分析

第一次只需要询问一个“十”字,复杂度为 $\mathcal O\left(2n\right)$。

下一次:询问一个“田”字,其中有一半会在第一次寻问的“十”字上,于是只有中心十字的 $\mathcal O\left(n\right)$ 和外层“田”字的一半 $\mathcal O\left(n\right)$ 需要询问。

第三次:“田”字已经在前两次操作时都询问完了,因此只有中心十字的 $\mathcal O\left(\dfrac n2\right)$ 需要询问。

之后每次的询问次数都是上次的次数除以二,因此总询问次数为:

$$\mathcal O\left(2n + n + n + \frac n2 + \frac n4 + \frac n8 + \cdots\right) = \mathcal O\left(5n\right)$$

稍微卡卡常即可。

$4n$ 做法

我们需要从本质上考虑“十”字法为什么会错。

<此处应有 $10$ 秒思考>

就是因为上次找到的相对高地的线被跟丢了。因此只要把上次“十”字考虑进来就行了,不需要任何额外询问。

$$\mathcal O\left(2n + n + \frac n2 + \frac n4 + \cdots\right) = \mathcal O\left(4n\right)$$


No comments

Post a comment