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\) 最小的点。

这样大概就做完了。注意本题还要搭配斜率优化。

posted @ 2024-02-19 08:03  383494  阅读(39)  评论(0)    收藏  举报