个人记录,可能存在一些错误或者问题。
好题。
这题和元旦激光炮有一点像,都是考虑根据给定的矩阵大小关系,在不确定某个位置具体值的情况下,把一定大于/小于答案的位置挖掉。
但是本题可以说是拓展了,因为它在确定的时候也递归成了一个子问题。
我们要找某个 \(n\times m\) 矩阵(满足从左上到右下单调递增)的第 \(k\) 小值,考虑递归成子问题,若我们把偶数行拿出来作为一个新的矩阵,发现它依然满足给出的限制,那么若我们求出了其第 \(k'\) 小值的轮廓,考虑用处,发现因为行与行之间的限制,这里的第 \(k'\) 小可能作为 \([2k', 2k' + m)\) 小中的任意一个。
那么我们考虑每次求出一个包含第 \(k\) 大的轮廓,并且用大根堆维护每次弹出最大值的过程,发现这是 \(O(n + m)\) 的,其实 nm 同阶,那么我们得到了一种操作次数 \(O(n)\) 的做法,但是这道题要求更加精细的实现。
- 可以用记忆化
- 考虑我们在弹出的时候若 \((i + 1, j)\) 和 \((i, j + 1)\) 都没弹出,\((i, j)\) 也不会弹出,所以可以用类似某种 dijkstra 的写法做,即“激活”(我也不知道我在说什么)。
没有优化 2 的实现
加了优化 2 的实现