题意:
给出 N 个点,选择其中 3 个点组成三角形,求最大面积的三角形的面积,如果不能组成三角形,输出 0。
题解:
1:面积最大的三角形的顶点一定在凸包上面
2:求凸包,然后O(n^3)枚举输出结果.
数据范围5e3,使用上述方法会超时.
如果把时间复杂度从O(n^3)降到O(n^2logn)或者更低就可以解决这道题了.
那么问题分解为怎么降低时间复杂度
插入UVA10173(旋转卡壳):
最小矩形面积覆盖
题意
给出平面上的一堆点,找出一个能够覆盖所有点的面积最小的矩形,输出面积及四个顶点的坐标。
题解:
经过观察发现,这个矩形一定有一个边是多边形的边!
然后通过旋转卡壳找到另外的三个点。
对于最高点,应该是叉积最大的那个。
对于最右边的,应该是点积最大的那个,点积对应的是投影的长度。
然后当i=0的时候,确定左边最长的初始点为右边最长的后面。
当我们用红色边放在多边形的右边相邻的边的时候,有一个事情必须知道,最高点一定在原来的最高点的后面!
旋转卡壳时间复杂度O(n),枚举凸包上面的所有的边时间复杂度是O(n),这样总的时间复杂度就从O(n^3)降到O(n^2).
(因为是突然想到的,口胡方法)
暴力大法果然tql......
下面进行一个延伸:
题意:
给定n个点,求锐角三角形的个数/总面积.
数据范围n<=2000
附:可能存在三点共线的点.
——(杜教PPT例题)
题解:
1:求锐角三角形的个数
对于锐角三角形来说,我们如果通过角度进行判断的话,情况及其复杂,可以对问题进行一个转换——>求锐角三角形的个数=总的三角形的个数-直角三角形的个数-钝角三角形的个数.
(总的三角形个数为C(3,n),直角三角形和钝角三角形的个数都能通过直角/钝角的数量唯一确定)
先给一个图:
枚举n个类似红圈圈住的点,对于每次枚举的情况,都对其它的点进行极角排序(时间复杂度O(nlogn)).
因为所要找的直角三角形和钝角三角形是在一个区间范围内,所以使用一个双指针就行了。
角度范围是[π/2,π).
因为存在三点共线的情况,所以需要减去形成一条线的。
2:求锐角三角形面积
求锐角三角形的面积同上(不是同最上面的例子),锐角三角形的面积=总的三角形面积-直角三角形面积-钝角三角形面积.
同样,还是按照双指针求区间范围内的钝角三角形的面积和直角三角形的面积,
假如说在[π/2,π)范围内有三个向量p1(x1,y1),p2(x2,y2),p3(x3,y3).
对于向量为q(x,y).
那么面积和为1/2( x1*y+x2*y+x3*y-x*y1-x*y2-x*y3).
可以发现,对于区间范围内的直角/钝角三角形的面积可以通过前缀和得到.
我们只需每次进行极角排序后计算x和y的前缀和就行了。
这样就能求出来直角三角形面积和钝角三角形的面积。
对于三角形的总面积,有一点需要考虑。
当我们计算p×q的时候和计算q×p的时候和为0.
这样结果就不正确了!
但是可以只计算范围在[0,π)内的点。
最后发现每个三角形被计算三次,最后的面积就是总面积/3-直角三角形面积-钝角三角形面积。
(这个貌似是吉如一老师出的题,数据范围是1e18,要使用int128)