闵可夫斯基和凸包

定义

参考链接

给定一个点集\(A\)和一个点集\(B\),然后我们通过这样的方式生成一个点集\(C\)
枚举\(A\)中所有的点\((X_a,Y_a)\), 枚举\(B\)中所有的点\(X_b,Y_b\), 然后将点\((X_a+Y_a, X_b+Y_b)\)加入点集\(C\)
点集\(C\)被称为点集\(A\)\(B\)的闵可夫斯基和
现在我们需要求出这个\(C\)点集的凸包
闵可夫斯基和凸包上的点等于两个点集凸包的不同向量种类数.
我们也会发现两个凸包内部所有点的两两之和都会存在于闵可夫斯基和凸包中

做法

分别求出点集\(A\)的凸包与点集\(B\)的凸包
首先:\(A\)中的第一个点与\(B\)中的第一个点(最左下的点) 的和一定在点集中,确定第一个点之后,接下去凸包上的点其实就是这个点的坐标加上两个凸包的某个向量的相对偏移.
维护\(two-pointer\), \(C\)凸包的下一个点要么沿着\(A\)凸包接下来的向量走,要么沿着\(B\)凸包接下来的向量走, 画个图就能清楚,一定是沿着凸包外围的向量一个个的走,不会跨过一些向量.
观看下面这幅图就能知道,最左边的红色点不会一下子直接选择下面那个凸包的2->3向量, 而是要么走上面的1->2,要么走下面的1->2

练习

CF 1195F
bzoj 2564

原文地址:https://www.cnblogs.com/517coding/p/11233468.html