原理

当求凸包的时候,如果问题中我们只考虑整数点凸包的值,实际上有一些直线虽然是在凸包上,但是我们仍然可以忽略掉它。

来看这个问题:现在有若干个直线,求给定 $x$ 时的最小值。

答案一定是在凸包上,并且是在上凸包。上凸包的每一部分都表示当 $x$ 在这个范围里,这条直线就是最小值。

来看这个图:

image.png

我们设 $f(ax + b, cx+d) := max(k | ak + b ≤ ck + d)$。那么 $line1$ 如果对答案有贡献的话,一定要满足: $f(line_0, line_1) < f(line_1, line_2)$.

$f(ax +b, cx+d) := max(k|ak + b \leq ck + d) = \left\lfloor\frac{d-b}{a-c}\right\rfloor$

所以我们可以拿这个来算凸包。

求最小值就算上凸包,求最大值,那么我们直接把所有 $line$ 的 $a, b$ 翻转,然后继续这样求就行了。

代码