wqs 二分学习笔记

WQS 二分

有一类问题,是从 \(n\) 个物品中恰好选择 \(k\) 个,而且如果没有恰好 \(k\) 个的限制的话,那就变得比较简单的题目。如果只有这样的限制的话,可以贪心来写。但是一般收益不是固定的,一般可以使用 WQS 二分来写。

举一个例子:

在分布在一条直线上的 \(n\) 个村庄中选 \(k\) 个建立邮局,求所有村庄到达其最近邮局的最小距离之和。\(n\le 3000,k\le 300\)

\(w(i,j)\) 表示在 \([i,j]\) 建邮局的最小距离之和。\(dp_{i,j}\) 表示前 \(i\) 个村庄,放 \(k\) 个邮局的最小距离和。

\(dp_{i,j} = dp_{p,j-1} + w(p+1,j)\)\(O(n^2k)\)

好像是过不了的。

我们令 \(g_{i}\)\(n\) 个村庄选择 \(i\) 个的答案。

这里我们可以观察到 \(g_{i+1}-g_{i}<g_{i} -g_{i-1}\) (其实需要严谨证明,一般可以通过打表的方式)

即斜率是单调的。

既然是单调的,就可以直接二分斜率。

\(g_x = kx+b\) 。可以知道 \(b = g_x-kx\) ,通过第二维每增加 1,就减一个 \(k\),即可。

这样就可以做到正确的时间复杂度。

最后可以加一个决策单调性做到更快的时间复杂度。

posted @ 2026-04-28 15:08  hnczy  阅读(23)  评论(0)    收藏  举报