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\),即可。
这样就可以做到正确的时间复杂度。
最后可以加一个决策单调性做到更快的时间复杂度。

浙公网安备 33010602011771号