WQS二分/带权二分/凸包优化

发布时间 2023-07-15 17:22:21作者: cqbzwwh

WQS二分/带权二分/凸包优化

应用范围

  1. 限制个数:给定一些物品选物品的限制条件,要求刚好选 \(m\) 个,让你最大化(最小化)权值。
  2. 单调性:选的物品越多,权值越大(越小)。

分析

1.原理解释:

假设限制不固定,当选 \(x\) 个时,最大权值为 \(f(x)\)。算法的核心就是将“选取物品”这一操作赋予权值,即每选择一个物品,我们将总权值加 \(C\)。这个 \(C\) 就是我们二分的东西。设经过我们“赋予权值操作后”,式子的值变成了 \(b\).可以得到 \(b=f(x)+C \times x\)

若我们二分,选定一个 \(C\) 的值,在 不考虑选 \(m\) 个物品的情况下 进行 \(dp\)。此时我们不仅要记录最小权值,还要记录这个权值对应的,选的物品个数。根据上文,我们便得到了 \(b\)\(x\).又已知 \(C\),就可以算出\(f(x)\).

当然,现在的 \(x\) 不一定就是题目要求的 \(m\),但由于问题具有单调性(见上),当 \(C\) 更小时,选择的物品会变少,\(x\)越大,当 \(C\) 更大时,选择的物品会变多,\(x\) 越大。根据 \(x\)\(m\) 的大小关系,不断调整 \(C\)的值,直到 \(x=m\).这时再根据 \(b\),\(x\)\(C\) 算出 \(f(x)\).


上面所描述的是一种理解的思路。下面我们把问题转化为“凸包问题”。

上文有这样一个式子:\(b=f(x)+C \times x\)。为了方便,现在把 \(b=f(x)+C \times x\) 变为 \(b=f(x)-C \times x\).(实际上只是把提前 \(C\) 变为 \(-C\),没有本质区别)。

发现这个式子形如 \(b=y-k \times x\). 把 \((x,f(x))\) 设为一个点。这些点的集合为凸包(不会证qwq,感觉只能用上一种思路证明单调性)。\(C\) 表示斜率。就相当于用一条斜率为\(k\)的直线切这个凸包。切线的截距显然是最小的(上一种理解思路就重合了)。切到的这个点为 \((x,f(x))\).不断调整 \(C\) 的过程就相当于在不断调整切线的斜率,使切线刚好切到\(m\).

细节处理

有时候,会发现当 \(C=p-1\) 时,\(x=m-1\),而 \(C=p\) 时,\(x=m+1\)。我们可以将 \(C\) 二分到小数,但是这样可能为\(T\).实际上,不需要小数也是正确的。参见Creeper_LKF的博客.

题目链接

http://222.180.160.110:1024/contest/3896