Skip to content

凸性相关

定义

  • 凸包:平面上包含所有点的最小多边形。
  • 上凸壳、下凸壳:凸包的上下两部分。
  • 离散函数的凸性:函数图像呈现为凸壳形状。

凸包性质

  • 上下凸壳的边斜率具有单调性。即对于上凸壳,从左到右各边斜率单调递减;对于下凸壳,从左到右各边斜率单调递增。
  • 对于凸包内任意两点 P(x1,y1)P(x_1,y_1)Q(x2,y2)Q(x_2,y_2),线段 PQPQ 上的所有点 (x,y)=(tx1+(1t)x2,ty1+(1t)y2)(x,y)=(tx_1+(1 - t)x_2,ty_1+(1 - t)y_2)0t10\leq t\leq1 都不在凸包外。
  • 对于任意一条经过凸包上某个点 P(x0,y0)P(x_0,y_0) 且斜率固定为 kk 的直线 yy0=k(xx0)y - y_0 = k(x - x_0),若要使 kk 最大(或最小),则该直线必然经过凸包上的点。进一步地,对于凸壳而言,其斜率 kk 必然在其邻边斜率范围之内。

函数凸性性质

  • 对于满足四边形不等式的序列划分问题,设将序列划分为 mm 段的最优值为 f(m)f(m),则 f(m)f(m) 关于 mm 必然具有凸性。
  • 若函数 y=f(x)y = f(x) 具有凸性,那么函数 y=max0txf(t)y = \max_{0\leq t\leq x} f(t)y=min0txf(t)y = \min_{0\leq t\leq x} f(t) 仍然具有凸性。例如,若“恰好划分为 mm 段”的情况具有凸性,那么“至少划分为 mm 段”的情况一定具有凸性,但反之并不一定成立(虽然实际中未见过反例)。
  • 在费用流问题中,设最小费用为 CC,流量为 FF,则 CC 关于 FF 具有凸性。若要指定某条边必选,可将其费用设为 -\infty,同样可证明其凸性。

联想点

当题目中出现比值(如 ab\frac{a}{b})、乘积(如 a×ba\times b)等实数意义上的形式时,应联想到凸包。凸包通常可用于解决一些特殊的最优化问题。

建立凸包

线性扫描法(离线做法)

设有点集 S={P1,P2,,Pn}S=\{P_1,P_2,\cdots,P_n\},首先将点按照横坐标 xx 从小到大排序。然后采用增量法构造凸包。假设已构造好前 i1i - 1 个点的凸包 CHi1CH_{i - 1},当加入点 PiP_i 时,考虑凸包形态的变化。根据凸包的定义,若从凸包 CHi1CH_{i - 1} 的末尾点开始,与 PiP_i 形成的折线呈现凹的形状,则将末尾的这些凹进去的点删掉,剩余部分依然构成凸包。

插入法(在线凸包)

每次插入一个点 PP,需找到其横坐标 xPx_P 被凸包的哪条边跨过。若加入当前点 PP 后不会使凸包更优,则直接结束操作。否则,将 PP 点左右两边凹进去的点删掉。其正确性与上述线性扫描法类似。

旋转卡壳

常见用途

用于求解平面上的最远点对。

引理

对于平面上的点集,其中任意一个点的最远点一定在该点集的凸包上。

流程

基于凸包边的斜率单调性,我们按顺时针方向枚举凸包的边 ABAB。对于每一条边 ABAB,考虑在凸包上与之距离最远的点 CC。由于凸包的性质,最远点 CC 也是按顺时针方向移动的。每次更新由边 ABAB 的两个端点 AABB 和最远点 CC 组成的点对作为答案。显然,通过这种方式可以考虑到所有不劣的解。

闵科夫斯基和

定义

设两个图形 AABB,闵科夫斯基和 A+B={a+baA,bB}A + B=\{a + b\mid a\in A, b\in B\},即由 AA 中任意一点与 BB 中任意一点相加得到的所有点组成的新图形。

基本结论

AABB 是两个凸包,则它们的闵科夫斯基和 A+BA + B 仍然是一个凸包。

常见用途

常用于凸包合并以及 {max,+}\{\max, +\} 卷积。下面主要讨论凸壳的合并。

流程

每次将两个凸壳 H1H_1H2H_2 的边拿出来,根据边的斜率进行贪心处理,类似于归并排序的方式。新凸壳的起始点是原凸壳 H1H_1H2H_2 起始点之和。

感性理解

为了使新的凸包能够包含所有由 AABB 中两点相加可能产生的点,需要让凸包尽可能大。

{max,+}\{\max, +\} 卷积的理解

可以将两个多项式 P(x)=i=0naixiP(x)=\sum_{i = 0}^{n}a_ix^iQ(x)=j=0mbjxjQ(x)=\sum_{j = 0}^{m}b_jx^j 看成两个点集 {(i,ai)i=0,1,,n}\{(i,a_i)\mid i = 0,1,\cdots,n\}{(j,bj)j=0,1,,m}\{(j,b_j)\mid j = 0,1,\cdots,m\}。对于一个固定的横坐标 kk,其 {max,+}\{\max, +\} 卷积的结果为 maxi+j=k(ai+bj)\max_{i + j = k}(a_i + b_j),这恰好符合闵科夫斯基和的定义,即所有满足横坐标和等于 kk 的点的纵坐标和的最大值。

wqs 二分

常见用途

给定 xx,求解凸函数 f(x)f(x) 的值。

流程

通过二分斜率 kk,考虑斜率为 kk 的直线 y=kx+by = kx + b 与凸函数 f(x)f(x) 的切点横坐标 x0x_0。由于凸性,横坐标 x0x_0 关于 kk 具有单调性。核心在于找到使 g(x)=f(x)kxg(x)=f(x)-kx 取得最大值的点的横坐标 xx,该点即为切点。

细节

  1. 二分的值域:需要分析凸壳上的边的斜率值域范围。通常只需考虑凸壳上第一条边和最后一条边的斜率,以此确定二分的上下界。
  2. 二分的类型(整数或实数)
    • 若为离散凸函数,通常凸壳上每条边的斜率为整数。
    • 然而,由于可能存在共线的点,直接二分实数可能出现问题。因此,建议二分整数。
    • 为处理共线情况,可钦定 xx 取最大或最小值,从而通过二分进行判定。
  3. 构造解:朴素的 wqswqs 二分可较容易地得到 f(x)f(x),但在求解具体的 xx 时会受到共线情况的影响。(待补充完善,目前对此理解尚不透彻,网上也缺乏完全准确的资料)

wqs 二分和闵科夫斯基和的联系

对于一个确定斜率 kk 的直线,设两个凸壳 H1H_1H2H_2,直线与 H1H_1H2H_2 的切点对应的截距之和,恰好等于 H1H_1H2H_2 做闵科夫斯基和之后的凸壳与该直线切点的截距。这表明 wqswqs 二分和闵科夫斯基和存在紧密联系。

这种联系主要源于具有凸性的问题通常可划分为若干子问题,最终通过合并子问题的解得到结果。闵科夫斯基和用于维护所有可能情况的解(以凸壳形式呈现),而 wqswqs 二分则专注于维护一个特定的解(以切点形式呈现)。有时,我们可以先预处理出闵科夫斯基和的结果,再结合 wqswqs 二分解决多次询问的问题。

斜率优化

核心

通过分析凸包的形态,确定最优解的选取方式。具体如下: 假设 dpdp 方程形如 dp[i]=maxj<i(dp[j]+A+Bij)dp[i]=\max_{j < i}(dp[j]+A + B\cdot i\cdot j)。注意到经过点 (x,y)(x,y) 且斜率为 kk 的直线方程为 yy0=k(xx0)y - y_0 = k(x - x_0),其截距为 ykxy - kx。因此,我们将每个点看作 (j,dp[j]+A)(j,dp[j]+A) 的形式,要寻找斜率为 B-B 的直线经过某个点时的最大截距,所以必然保留的是上凸包。

常见算法

  1. 建立凸包
    • 在线且横坐标无单调性:可使用李超线段树。
    • 其他情况:直接通过线性方式建立凸包。
  2. 寻找最优点
    • 在线且查询斜率无单调性:可通过二分凸包或在李超线段树上直接查询。
    • 其他情况:使用指针直接扫描。

例题

  1. [ABC356G] Freestyle:判定可行性相对简单,关键在于处理最优性问题。贪心和动态规划方法在此处难以突破,网络流方法也不太适用。假设仅使用两种 stylestyle,列出相关式子。其中不超过 CC 的条件在实数意义下大概率可使等式成立,此时可发现该式子与向量的等和线相关。为使整体取值尽量小,需先求出凸包,然后在凸包上进行二分查找。
  2. [JOISC2022] 京都观光:直接求解较为困难。写出拐点相关的式子后,可发现其与凸包相关。

Released under the MIT License.