数据过水

P7883 平面最近点对(加强加强版)

SunsetSamsara @ 2022-04-04 07:48:44

RT,

我们充分发扬人类智慧:按原点距离排序。 根据数学直觉,在排序后,答案中的两个点在数组中肯定不会离得太远 所以我们只取每个点向后的 50 个点来计算答案 这样速度快得飞起,在 n=400000 时都可以在 0.3 s 内卡过

然后这个做法就 过了 …… 代码:

#include <stdio.h>
#include <math.h>
#include <algorithm>
#define lld long long
using namespace std;
struct vec {
    lld x, y;
} a[400010];
vec operator - (const vec & a, const vec & b) { return (vec){a.x - b.x, a.y - b.y}; }
lld len(const vec & a) { return a.x * a.x + a.y * a.y; }
inline bool cmp(vec a, vec b) { return len(a) < len(b); }
lld minn = 1e18;
int n;
int main() {
    scanf("%d", & n);
    for (int i = 1; i <= n; ++ i) scanf("%lld%lld", &a[i].x, &a[i].y);
    lld t;
    sort(a + 1, a + n + 1, cmp);
    for (int i = 1, j; i <= n; ++ i)
        for (j = i + 1; j <= n && j <= i + 50; ++ j)
            minn < (t = len(a[i] - a[j])) ? 0 : minn = t;
    printf("%lld\n", minn);
}

by SunsetSamsara @ 2022-04-04 07:51:57

取后面 10 个点都能过……


by SunsetSamsara @ 2022-04-04 07:53:25

@fstqwq 请求加强数据


by qfpjm @ 2022-04-04 08:28:57

qp


by FutaRimeWoawaSete @ 2022-04-04 08:32:15

@Enderite 憨子,别求了,你请求之前看一下这道题已经被请求多少次加强了。。。


by SunsetSamsara @ 2022-04-04 08:43:02

@FutaRimeWoawaSete 确实,我看了一下,有人是双曲线乱搞的,这个是用圆乱搞的


by FutaRimeWoawaSete @ 2022-04-04 08:48:16

@Enderite 圆做法貌似也有过,还有其他高妙乱搞做法都卡不掉,这道题基本上卡不掉了。


by cyffff @ 2022-04-04 09:29:12

@FutaRimeWoawaSete @Enderite 应该不是卡不掉,是出题人认为足够高明了,不卡了


by SunsetSamsara @ 2022-04-04 16:02:52

@cyffff az


by cyffff @ 2022-04-04 17:29:13

我觉得彳亍,因为确实算是有新意的乱搞,我也没去卡;不过要卡也和投影到直线上一样好搞,大概你们也知道这一点。

这个题的数据的目的已经达到了,测出一大堆原来没挂现在挂了的分治和乱搞,所以不会针对你们的代码更新数据。(当然如果你们敢在比赛写这个的话,我只能说你们是勇士)


|