[POJ 2079]

Triangle

旋转卡壳

题意:给出最多50000个点,可取任意3点作三角形,求这些三角形中得面积最大值。

首先,可以明确的是三角形的三个顶点必定在凸包上。求出凸包后,点的数量减少到O(n^2)算法可解。

然后,需要考虑的是最大面积三角形的三点会以何种形式出现。一开始考虑的是对于所有的对踵边,枚举其对应的所有三角形,但是WA。后来发现,三角形的三边可以都不为对踵边。应该枚举的是各个点对应的最大三角形面积。在求顶点i对应的最大三角形面积时,要依次求出当j取其余n-1个点时对应的最大三角形面积,因此,可以构造如下算法:

0. 初始化顶点i为第一个顶点:
1. 初始化j为i在凸包上的下一个顶点
2. 取k为使area(i,j,k)最大的顶点,更新最大面积
3. 当j!=i时,取j为下一个顶点,回到2.;否则取i为下一个顶点,若未取尽,回到1.

其中第3步计算k时,容易利用旋转卡壳的思想证明如下结论:边(i,j+1)对应的k,必定在边(i,j)对应的k之后。由此,对于某个i,其对应的j和k的总自增次数都是O(n)级别的,总体复杂度便是O(n^2)。