wqs二分
wqs 二分一般是解决如 \(n\) 个物品需要选恰好 \(m\) 个这种形式的题。
我们不妨考虑求最下的贡献。
我们记 \(X\) 为所有方案的集合, 对于每个方案 \(x \in X\), 记\(f(x)\) 表示在这种方案下的贡献, \(g(x)\) 表示在这种方案下你选了几个物品。
所以我们如果把每个方案看作为一个坐标为 \((g(x), f(x))\) 的点, 我们就是要求出对于每一个 \(x\), 在这跟直线上 \(y\) 坐标最小的是哪个点。
我们记 \(A(v)\) 表示在 \(x=v\)中, 可选的点的 \(y\) 坐标最小为 \(A(v)\)
即我们需要的档案为 \(A(m)\)
一下写法建立在所有的 \(1 \le i \le n\), \((i, A(i))\) 形成一个下凸包。
我们考虑求出一条斜率为 \(k\) 的一次函数, 满足这条线段排除那些重合的点后有且经过一个点 \((v, A(v))\) (注意, 不需要经过原点) 我们可以肯定, 一定存在一条斜率唯一的, 因为构成了一个下凸包, 只经过这个点的代价。
但是这条线段经过的点一个都不确定, 所以我们可以通过上下移动的方式, 把这条线段其中一个点移到原点处。
假设这个图只有最终的最优点, 可以通过二分找到经过我们需要点的斜率, 然后就可以算出来了。
当我们需要让每个 \(x\) 只在最小的 \(y\) 时判断, 所以我们可以通过取最小值的方式实现。(因为若你选了一个不是最小 \(y\) 坐标的点, 在这条直线上那个最小 \(y\) 坐标的点一定比这个点更优秀)