决策单调性

· · 个人记录

对于有决策单调性的问题,直接上分治可以做到 O(n\log n) 的优秀复杂度,这种方法非常好写,常数很小,并且很万能。

但是对于满足四边形不等式的矩阵,SMAWK 算法可以在 O(n) 的时间复杂度内求出每一行的最小值以及它的位置。

如果矩阵两维不一样大,那么复杂度就(可以这样认为)是 O(n+m)

首先先探究满足四边形不等式的矩阵有什么性质。

pos_i 表示第 i最后一个最小值的位置。

四边形不等式:

\forall x,y,a_{x,y}+a_{x+1,y+1}\le a_{x,y+1}+a_{x+1,y}

推论:

\forall x_1<x_2,y_1<y_2,a_{x_1,y_1}\ge a_{x_1,y_2}\Rightarrow a_{x_2,y_1}\ge a_{x_2,y_2} \forall x_1<x_2,y_1<y_2,a_{x_2,y_1}<a_{x_2,y_2}\Rightarrow a_{x_1,y_1}<a_{x_1,y_2} pos_i\le pos_{i+1}

对于一个 n\times m 的矩阵,我们以 n,m 的大小关系分类讨论。

现在重点来看 n<m 时如何删除所有无用列。

我们考虑求出一个下三角矩阵使得每一行的最小值都在其中。根据之前的性质可以发现一定存在这样的下三角矩阵。

假设当前考虑到第 i 列,已经加入了 k 列,z_j 表示第 j 个加入的列的编号:

这样做一次的时间复杂度是 O(m)

当问题归约到 n=1m=1 时,直接暴力完成。

毛估估一下,你就会拍案而起:这个算法时间复杂度显然是 O(n+m)

板子题:CF1423M