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);
}