旋转卡壳
例题:P1452 .
题意:找到所有点对的最大距离。
一个凸包可以把所有点给包含进去,很明显最大距离点对是凸包上的点的点对。于是现在求凸包的最长直径。
旋转卡壳
依次按照极角枚举凸包上的边,找出与这条边最远距离的顶点,寻找这个点可以通过叉积算三角形面积实现。很明显顺次枚举边时,顶点也是顺次移动的,可以证明移动顶点复杂度为\(O(n)\)。对于每个边和其对应顶点所形成的三角形,答案与这三条边取\(max\)就行了。
为什么对于一条边找最远顶点一定包含了最长直径?可以发现直径对应的两个顶点,一定存在一个包含了这两个点和这两个点中某个点的相邻点的一个三角形,那么也一定会更新到这条边。