UNR #8 Day2 难度查找 个人记录

个人记录,可能存在一些错误或者问题。

好题。

这题和元旦激光炮有一点像,都是考虑根据给定的矩阵大小关系,在不确定某个位置具体值的情况下,把一定大于/小于答案的位置挖掉

但是本题可以说是拓展了,因为它在确定的时候也递归成了一个子问题。

我们要找某个 \(n\times m\) 矩阵(满足从左上到右下单调递增)的第 \(k\) 小值,考虑递归成子问题,若我们把偶数行拿出来作为一个新的矩阵,发现它依然满足给出的限制,那么若我们求出了其第 \(k'\) 小值的轮廓,考虑用处,发现因为行与行之间的限制,这里的第 \(k'\) 小可能作为 \([2k', 2k' + m)\) 小中的任意一个。

那么我们考虑每次求出一个包含第 \(k\) 大的轮廓,并且用大根堆维护每次弹出最大值的过程,发现这是 \(O(n + m)\) 的,其实 nm 同阶,那么我们得到了一种操作次数 \(O(n)\) 的做法,但是这道题要求更加精细的实现。

  1. 可以用记忆化
  2. 考虑我们在弹出的时候若 \((i + 1, j)\)\((i, j + 1)\) 都没弹出,\((i, j)\) 也不会弹出,所以可以用类似某种 dijkstra 的写法做,即“激活”(我也不知道我在说什么)。

没有优化 2 的实现
加了优化 2 的实现

posted @ 2024-11-14 16:58  SkyMaths  阅读(34)  评论(0)    收藏  举报