← 全部文章

闵可夫斯基和 学习笔记

本文目录(2 节)
  1. 什么是闵可夫斯基和?
  2. 回到 DP:它和优化有什么关系?

什么是闵可夫斯基和?

在几何上,给定两个点集 AA 和 BB,它们的闵可夫斯基和定义为: C=A+B={a+b∣a∈A,b∈B} C = A + B = \{ a + b \mid a \in A, b \in B \} 也就是把 AA 中的每一个点和 BB 中的每一个点做向量加法。

【结论】
如果 AA 和 BB 都是凸多边形,那么它们的闵可夫斯基和 CC 也是一个凸多边形。
更绝的是,CC 的边集,恰好是 AA 的边集和 BB 的边集按照极角排序后拼接在一起的结果!

例如:对于点集 P={(0,0),(−3,3),(2,1)}P=\{(0,0),(-3,3),(2,1)\} 和 点集 Q={(0,0),(−1,3),(1,4),(2,2)}Q=\{(0,0),(-1,3),(1,4),(2,2)\},

闵可夫斯基和 学习笔记:原文插图

将 PP 沿 QQ 的每个向量平移:

闵可夫斯基和 学习笔记:原文插图

不难发现新图形也是一个凸包:

闵可夫斯基和 学习笔记:原文插图

而新图形的边正是 PP 的边和 QQ 的边按照极角排序后拼接在一起得到的。

【例题】[JSOI2018] 战争

转化:有交   ⟺  ∃a∈A,b∈B, a+v⃗=b  ⟺  v⃗=b−a∈B+(−A)\iff \exists a\in A, b\in B,\ a+\vec{v}=b \iff \vec{v} = b - a \in B + (-A)。
解法:求出 BB 与 −A-A 的闵可夫斯基和 CC(凸多边形),问题变为判断点 v⃗\vec{v} 是否在 CC 内。复杂度 O((n+m+q)log⁡n)O((n+m+q)\log n)。

【例题】[USACO22JAN] Multiple Choice Test P

转化:目标是最大化向量和的模长。模长函数是凸函数,最大值必然在可能和的凸包的顶点上取得。而可能和的集合正是所有组向量集合的闵可夫斯基和。因此,我们只需要计算所有组向量的闵可夫斯基和的凸包,再遍历顶点取最大距离。
解法:对每组向量求凸包,提取边向量(相邻顶点之差),将所有边向量按极角排序,然后从起点开始依次相加,得到闵可夫斯基和凸包的所有顶点,最后计算每个顶点到原点的平方距离,取最大值。复杂度 O(Tlog⁡T)O(T\log T)(TT 为总向量数)。

回到 DP:它和优化有什么关系?

在算法竞赛中,我们遇到的通常不是二维平面上的乱斗,而是关于序列的 DP 状态合并。

最经典的场景就是树上背包:

h(k)=max⁡i+j=k(f(i)+g(j)) h(k) = \max_{i+j=k} (f(i) + g(j))

这叫作 (max⁡,+)(\max, +) 卷积。通常它的复杂度是 O(∣f∣×∣g∣)O(|f| \times |g|) 的。

【结论】
如果 ff 和 gg 都是上凸函数(即差分单调递减,Δf(i)=f(i+1)−f(i)\Delta f(i) = f(i+1) - f(i) 单调递减),把 ff 和 gg 的图像看作二维平面上的上凸壳,那么 hh 的图像恰好就是 ff 和 gg 的闵可夫斯基和的上边界!

既然凸多边形的闵可夫斯基和只是把边按斜率(极角)排序,而在 1D 函数中,边就是差分,斜率就是差分的值,那么计算 hh 的差分数组 Δh\Delta h,只需要将 Δf\Delta f 和 Δg\Delta g 这两个单调递减的数组,像归并排序一样合并起来即可!

复杂度发生了质变:从 O(∣f∣×∣g∣)O(|f| \times |g|) 降到了 O(∣f∣+∣g∣)O(|f| + |g|)。

【例题】[ICPC 2022 Nanjing R] 工厂重现

DP 结构:定义 fu(j)f_u(j) 为以 uu 为根的子树内选 jj 个工厂,且所有工厂到 uu 的加权距离和等辅助信息下的最大贡献。转移是 (max⁡,+)(\max,+) 卷积合并各子树。
优化:fuf_u 是上凸函数,其差分数组单调递减。合并子树等价于对差分数组做闵可夫斯基和(归并)。用平衡树维护差分序列,启发式合并,并支持因连边产生的区间加等差数列的标记。复杂度 O(nlog⁡2n)O(n\log^2 n)。

【例题】[APIO 2016] 烟花表演

DP 形式:设 fu(x)f_u(x) 为使 uu 子树内所有叶子到 uu 的距离均为 xx 的最小代价。转移包含 (min⁡,+)(\min,+) 卷积:fu(x)=∑vmin⁡y{fv(y)+∣wuv+y−x∣}f_u(x) = \sum_{v} \min_{y} \{ f_v(y) + |w_{uv} + y - x| \},并叠加绝对值函数。fuf_u 均为下凸函数。
与闵可夫斯基和的联系:下凸函数的 (min⁡,+)(\min,+) 卷积等价于对其斜率(差分)做闵可夫斯基和。因此转移的本质是合并多个下凸壳的边序列。
实现:利用 Slope Trick,用可并堆(左偏树)维护拐点,以此表示斜率的变化。合并堆即为闵可夫斯基和,插入/删除拐点对应添加绝对值函数等操作。复杂度 O(nlog⁡n)O(n\log n)。

【例题】[THUPC 2024 初赛] 一棵树:

DP 结构:令 dpu,idp_{u,i} 表示以 uu 为根的子树内选 ii 个黑点的最小权值。转移时合并子节点: dpu,i=min⁡j{dpv,j+∣k−2j∣+dpu,i−j}.dp_{u,i} = \min_{j} \{ dp_{v,j} + |k - 2j| + dp_{u,i-j} \}. 设 fv,j=dpv,j+∣k−2j∣f_{v,j} = dp_{v,j} + |k - 2j|,则转移变为 (min⁡,+)(\min,+) 卷积 dpu=fv⊕dpudp_u = f_v \oplus dp_u。
优化:归纳可证 fv,dpuf_v, dp_u 均为下凸函数,差分数组单调递增。(min⁡,+)(\min,+) 卷积等价于对差分数组做闵可夫斯基和(归并)。Δfv\Delta f_v 由 Δdpv\Delta dp_v 经前缀 −2-2、后缀 +2+2 得到(奇偶性略有不同)。用堆维护前 ⌊k/2⌋\lfloor k/2 \rfloor 个差分,vector 维护剩余部分,合并时启发式合并,打标记处理区间加减。复杂度 O(nlog⁡2n)O(n\log^2 n)。

插图:OI Wiki 项目组(CC BY-SA 4.0 / SATA),原图未修改。

评论

    填写昵称即可留言。评论经站主审核后公开,请勿提交私人信息。

    正在连接评论服务…