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
取后面
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
我觉得彳亍,因为确实算是有新意的乱搞,我也没去卡;不过要卡也和投影到直线上一样好搞,大概你们也知道这一点。
这个题的数据的目的已经达到了,测出一大堆原来没挂现在挂了的分治和乱搞,所以不会针对你们的代码更新数据。(当然如果你们敢在比赛写这个的话,我只能说你们是勇士)