wqs 二分 学习笔记
本文采用 CC BY-NC-SA 协议发布。
闲话
我怎么啥都不会啊。/kel
正文
wqs 二分(即 Aliens' trick)是一类优化技巧,用来优化有个数限制的 dp。
例题:IOI2016 Aliens
题意省流:给你 \(n\) 个区间 \(a_i\),你要选最多 \(m\) 个区间 \(b_i\) 覆盖这 \(n\) 个区间,目标是最小化 \(m\) 个区间的长度平方和减去它们重叠的长度平方和(重叠多次算多次)。
先将 \(a\) 排序并去除包含关系。
第一眼这个 dp 要记录当前覆盖到哪些区间,用了几个区间,所以状态数是 \(\Omega(nm)\) 级别的。而 wqs 提供了一种方法,使得状态数压缩为 \(\Theta(n)\),代价是要做 \(O(\log V)\) 次 dp,\(V\) 是值域。
先看普通 dp。记 \(dp(i,j)\) 为覆盖前 \(i\) 个区间,用了 \(j\) 个区间的最小代价。固定住 \(i\) 这一维,观察 \(dp_i(j)\) 这个函数随 \(j\) 的变化情况,发现(不会证)它是下凸的。
wqs 二分先忽略了 \(j\) 这一维,改记 \(dp(i)\) 和 \(num(i)\) 为覆盖前 \(i\) 个区间的最小代价和代价最小前提下的最小区间数。之后给物品加一个“代价”,控制选的物品数量。wqs 二分就是二分这个“代价”,使得刚好选了 \(m\) 个区间。
为什么这样是最优的呢?首先(本题中)可以看作是一条直线在切下凸包,wqs 二分这条直线的斜率。既然是凸包,那么在切到点 \((x_0,y_0)\) 的时候它一定也是 \(x=x_0\) 和凸包的交点中 \(y\) 最小的点。
这样大概就做完了。注意本题还要搭配斜率优化。

浙公网安备 33010602011771号