旋转卡壳在移动最远点的时候,如果出现两点到边的距离相等的情况,需要贪心地移动到逆时针顺序最大的点,而不能停在第一个点。
如果你只这么修改可能会喜提几个 TLE……当点数只有 2 时(一条线段),所有的点到唯一边的距离都相等(等于 0),此时找最远点时会在两点间反复横跳,陷入死循环,因此需要特判。
代码如下(预处理的凸包储存在数组 convex_vertices 里):
ll diameter2(size_t n)
{
size_t k = 1;
ll diam = 0;
if (n <= 2)
{
return dis2(convex_vertices[1], convex_vertices[2]);
}
for (size_t i = 1; i <= n; i++)
{
Point u = convex_vertices[i], v = convex_vertices[i % n + 1];
while (distance_to_line(convex_vertices[k], u, v) <= distance_to_line(convex_vertices[k % n + 1], u, v))
{
k = k % n + 1;
}
diam = max(diam, max(dis2(u, convex_vertices[k]), dis2(v, convex_vertices[k])));
}
return diam;
}