闵可夫斯基和

概述

对于两个点集 \(A,B\) 来说,把其中的每一个点都看做是对应向量,则这两个集合的闵可夫斯基和定义为 \(C=\{ a+b|a\in A,b\in B \}\)

凸包的闵可夫斯基和

考虑 \(C\) 为凸包 \(A,B\) 的闵可夫斯基和,那么 \(C\) 的大小应该为 \(|A||B|\),但是如果考虑 \(C\) 的凸包,那么点数应该是 \(O(|A|+|B|)\) 的。

如图:

至于为什么是这样,我们以上凸壳为例,考虑两个上凸壳的闵可夫斯基和其实是两个上凸壳的归并排序,

如图:

易发现最终凸包上的边都是原来的边,这一点就足以充分说明上面的结论。

所以两个凸包的闵可夫斯基和可以做到 \(O(size)\)。利用类似归并排序即可。具体实现中,我们考虑用一个数组表示一个凸壳,\(a_i\) 表示横坐标为 \(i\) 时凸壳上对应点的纵坐标。

注意到一个凸壳相当于是若干一次函数的复合,则两个上凸壳的合并相当于它们做 \((\max,+)\) 卷积,即加起来的结果取 \(\max\)。这是因为我们考虑 \((\max,+)\) 卷积的形式:

\[c_k=\max\limits_{i+j=k}\{ a_i+b_j \} \]

如果把 \(i,j\) 看做横坐标,把 \(a_i,b_j\) 看做两个凸壳的纵坐标,那么这和 \(C=A+B\) 的定义不谋而合,在 \(C\) 中选的那些最优的点一定构成一个凸壳,而这个凸壳就是我们合并得到的凸壳。

同样的,取 \(\min\) 就是做 \((\min,+)\) 卷积。

闵可夫斯基和与 wqs 二分

wqs 二分可以在 \(O(n\log n)\) 的时间复杂度内求出某一个点值的最优值,但是如果我们的询问变成所有的横坐标,该怎么做?

考虑 wqs 二分的一个经典问题:给定长度为 \(n\) 的序列 \(a_i\),要求对于每个 \(k=1,2,\cdots,n\),恰好选出 \(k\) 个不相交的子区间,最大化所有不相交子区间内权值和的和。

显然这个问题可以构建一个费用流模型,如图:

所以这是一个凸函数,可以用 wqs 二分来解决单个值的问题。考虑加强版的问题。

首先考虑一个 DP,设 \(f_{l,r,k,0/1,0/1}\) 表示 \([l,r]\) 中选 \(k\) 个区间,左端点有没有被覆盖,右端点有没有被覆盖。加上后两维的原因是可以合并相邻的两个区间。

考虑这个函数显然关于 \(k\) 是一个凸函数,所以我们任意去一个分界点,总可以在 \(r-l\) 的时间内求出。考虑闵可夫斯基和类似于归并,我们可以取分界点为区间中点,类似分治,求出答案。

posted @ 2023-07-13 21:17  NuclearReactor  阅读(157)  评论(0编辑  收藏  举报