闵可夫斯基和

闵可夫斯基和

两个二维欧几里得空间上的点集 \(A,B\) 的闵可夫斯基和定义为:

\[A+B=\{a+b\mid a\in A,b\in B\} \]

你可以看成是把 \(B\) 中元素视为向量,然后把 \(A\) 中元素平移。当然,反过来也一样。

下面阐述一个重要的定理,我们记 \(cov(A)\) 表示 \(A\) 的凸包,那么:

\[cov(C)\subseteq cov(A)+cov(B) \]

证明的话,你不妨假设 \(a\not\in cov(A)\),我们证明 \(a+b\not\in cov(C)\)

这是简单的,你考虑前者说明 \(a\)\(cov(A)\) 所包围,而我们把这个凸包整个平移向量 \(b\) 之后,\(a+b\) 肯定也被包围着,不会成为凸包上的点。

接下来我们阐述求这个东西的方法,受个人水平所限,我们所说的方法针对于上凸壳,针对凸包的话似乎可以按极角归并排序。

对于凸壳而言,我们可以把它表示成一个函数的样子,又由于我们研究的凸壳一般都是整数坐标,所以我们可以用离散的数组来表示这个凸壳。比方说 \(f_i,g_i\)

考虑在这种表示方式下,闵可夫斯基和是什么样子。你发现这个就是 max+ 卷积。

由于这是凸的,所以差分数组是单调的,我们求卷积相当于在差分数组中选一共 i 个数加起来求最大值,这个就是归并排序对吧。

回到原来的表示形式,我们也可以把斜率归并排序,就做完了。

应用

由于我并不学计算几何,所以讲的大多都是与 wqs 二分结合。

我们直接上最强版题面吧。

给你 \(n\) 个数,以及 \(q\) 次询问区间 \([l,r]\) 中恰好选 \(k\) 个不交区间的和的最大值。

如果没有区间限制和多组询问,这个东西是 wqs 二分典题。

考虑加入多组询问,我们干脆把最后的凸包求出来。

这个可以分治,求左右凸包,然后闵可夫斯基和合并。合并的时候要注意,如果左凸包选了右端点,右凸包选了左端点,那么它们事实上可以合并成一个区间。所以额外记录左右端点选择情况分讨合并。

考虑加入区间限制,我们第一想法肯定是扔到线段树上。

现在你手头有 \(\log n\) 个凸包,你想求出它们的闵可夫斯基和在 \(k\) 处的值。

那显然我们不能 \(O(len)\) 合并,也不能 \(O(k)\) 归并。

你考虑使用 wqs 二分类似的方法,我们二分额外价值 \(w\),然后再在每个区间的凸包上二分找切点。

复杂度是 3 个 log,寄寄寄。

但是我们可以把最后一个二分去掉,只要我们询问的斜率满足单调性。

你考虑把第一个二分当成一个整体二分,整体二分有一种写法就是,对每个询问,求出当前要二分的 mid,然后对 mid 排序,用一个指针从左到右扫一遍,找出该往哪边走。这样由于二分次数是 \(\log\) 的,所以指针移动次数是线性对数的。

那我们可以采用这种做法,相当于是对全局进行 \(\log\) 次 wqs 二分,求出要问的斜率,排序,然后决定往哪边扔。这样每次二分的时候,每个线段树节点的凸包被询问的斜率都是单调的,就可以均摊了。

总复杂度 \(O((n+q)\log n\log v)\)

https://www.luogu.com.cn/blog/Flying2018/wqs-er-fen-min-ke-fu-si-ji-hu-xue-xi-bi-ji

posted @ 2024-01-24 17:06  PYD1  阅读(8)  评论(0)    收藏  举报