WA #17 91pts 的可能原因之一
查看原帖
WA #17 91pts 的可能原因之一
733279
Sunlight_zero楼主2023/10/16 13:24

旋转卡壳在移动最远点的时候,如果出现两点到边的距离相等的情况,需要贪心地移动到逆时针顺序最大的点,而不能停在第一个点。

如果你只这么修改可能会喜提几个 TLE……当点数只有 2 时(一条线段),所有的点到唯一边的距离都相等(等于 00),此时找最远点时会在两点间反复横跳,陷入死循环,因此需要特判。

代码如下(预处理的凸包储存在数组 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;
}
2023/10/16 13:24
加载中...