浅谈决策单调性
好难。Hootime 是不是不适合学 OI。
以下的
从四边形不等式讲起
四边形不等式
若无特殊说明,以下均保证
是一个不等式(废话),长这样:
其中
这个东西还有另一种形式:
简记为「交叉小于包含」。
下证两个式子等价。
充分性很容易证明,只需要将代入
a' = a, b' = a+1, c' = b, d' = b+1 代入(1) 即可。必要性:
我们将
(2) 改写为如下形式:w(a+1, c+1)-w(a+1, c) \le w(a, c+1)-w(a, c) \tag{1.1} 那么我们使用数学归纳法,假设
w(b-1, c+1)-w(b-1, c) \le w(a, c+1)-w(a, c) 由
(1.1) 得,w(b, c+1)-w(b, c) \le w(b-1, c+1)-w(b-1, c) 合并两式,得
w(b, c+1)-w(b, c) \le w(a, c+1)-w(a, c) \tag{1.2} 又改写
(1.2) 得:w(b, c+1)-w(a, c+1) \le w(b, c)-w(a, c) \tag{1.3} 我们再次使用数学归纳法,假设
w(b, d-1)-w(a, d-1) \le w(b, c)-w(a, c) 那么同理,可得:
w(b, d)-w(a, d) \le w(b, c)-w(a, c) \tag{1.4} 移项得:
w(a, c)+w(b, d) \le w(a, d)+w(b, c)
不严谨地说如果你的大脑比较擅长空间想象的话,由
经典结论
1
对于问题:
下证性质的正确性。
反证法。设存在
i < i' 且\mathrm{opt}(i) > \mathrm {opt}(i') 。设
j \leftarrow \mathrm{opt}(i), j' \leftarrow \mathrm {opt}(i') 。整理如上不等关系得j' < j \le i < i' 。又由最优性可得,
w(j, i) < w(j', i), w(j', i') < w(j, i') 。将两式相加得
w(j, i)+w(j', i') < w(j', i)+w(j, i') ,即w(j', i)+w(j, i') > w(j, i)+w(j', i') 。我们用
a, b, c, d 代替j', j, i, i' ,发现式子变成了w(a, c)+w(b, d) > w(a, d)+w(b, c) ,与四边形不等式矛盾。
2
对于问题:
下证性质的正确性。感谢 @Jink 给我讲懂了这个证明。
引理:如果
w 满足四边形不等式且i < i+1 ,有\mathrm{opt}(i) \le \mathrm {opt}(i+1) 。设
j \leftarrow \mathrm{opt}(i), k \in [1, j-1] 。由于
j 最优,有:f_{j-1}+w(j, i) \le f_{k-1}+w(k, i) \tag{2.1} 移项得:
f_{j-1}-f_{k-1} \le w(k, i)-w(j, i) \tag{2.2} 又由于
w 满足四边形不等式,有w(k, i)+w(j, i+1) \le w(j, i) + w(k, i+1) 。移项得:w(k, i)-w(j, i) \le w(k, i+1)-w(j, i+1) \tag{2.3} 合并
(2.2) ,(2.3) 得:f_{j-1}-f_{k-1} \le w(k, i+1)-w(j, i+1) \tag{2.4} 移项得:
f_{j-1}+w(j, i+1) \le f_{k-1}+w(k, i+1) \tag{2.5} 从而证明了此时选
k 一定不优于选j ,因此\mathrm {opt}(i+1) \notin [1, j-1] 。对这个结论使用数学归纳法可以得到决策单调性,这里就不赘述了。
算法们
拿到决策单调性其实题就做了一大半了。剩下的就是选择算法并且实现。
选择算法主要需要看
- 移动访问:有点像莫队。具体就是
w(i, j) 只能通过w(i \pm 1, j) 或者w(i, j \pm 1) 来\mathrm O(1) 求得。 - 动态计算:
w(i, j) 的计算依赖f_{1 \sim i} ,你只能顺次计算f 和i 。
这两个性质并不互斥,有可能同时出现。
整体二分
假设我们现在要处理
我们算出
于是我们对两边分治一下即可。考虑分治树,树高为
整体二分是可以处理移动访问的情况的(先把
如果要处理动态计算的话当然可以使用 cdq 分治,但是
二分队列
我们换一个思路,考虑当前及以前的决策对之后的决策的影响。
我们加强【经典结论 1】的结论。
对于问题:
f(i) = \min_{1 \le j \le i} w(j, i) ,只考虑1 \le j \le k 的决策,如果w 满足四边形不等式且i < i' ,有\mathrm{opt}_k(i) \le \mathrm {opt}_k(i') 。
换句话说就是如果只考虑
下证加强结论的正确性。
我们有
w'(j, i) = w(j, i)+M[j > k] ,其中M 为充分大的正实数。我们发现w' 仍然满足四边形不等式。这时我们考虑问题
f'(i) = \min_{1 \le j \le i} w'(j, i) 。由【经典结论 1】可得该问题的决策单调性。明显在该问题中大于k 的决策是不优的,于是我们得到\mathrm{opt}'(i) = \mathrm{opt}'_k(i) = \mathrm{opt}_k(i) ,结论得证。
那么我们就可以对已有的决策
这么讲可能有点抽象,下面是算法流程。可以适当类比斜率优化中的单调队列。
- 我们正在处理决策
j 。如果我们发现队列的队头的最优区间的右端点是j-1 ,那么把它弹掉。其实不弹问题也不大来着,但是会多一次二分加大常数。 - 然后我们要把
j 入队。如果你想问为什么不是先处理f_j 再入队那么问题有w(j, j) 的转移。- 我们设队尾元素为
j' ,其最优区间的左端点为l_{j'} ,右端点为r_{j'} 。 - 如果决策
j 在l_{j'} 优于j' ,那么j' 可以完全被j 代替,因而没有存在的必要了,我们弹掉j' 。重复这个过程直到没有能被弹掉的j' 。 - 如果队列空了,我们向队列中加入
(j, j, n) ,表示认为j 是之后所有决策的最优决策点。 - 否则,我们在当前的队尾的最优区间
[l_{j'}, r_{j'}] 中二分出一个位置p ,满足p 是第一个j 优于j' 的位置。然后,我们将队尾修改为(j', l_{j'}, p-1) ,再向队列中加入(j, p, n) 。特别地,如果二分出p > n ,那么j 在整个区间上都不优,不用入队。
- 我们设队尾元素为
- 然后我们发现队头就是
j 的最优决策,更新j 即可。
每个决策都只会被入队和出队一次,出队是
这个算法很明显可以处理动态计算的问题,但是处理不了移动访问。
简易 LARSCH 算法
这个算法可以看 Register_int 大佬的在线决策单调性地皮还能单老哥分治做? - 洛谷专栏。讲得还是很好的。
这个算法其实可以部分类比 CDQ 分治,有点像又不是很像的样子。
我们设计一个函数