数据过水
查看原帖
数据过水
228486
SunsetSamsara楼主2022/4/4 07:48

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);
}
2022/4/4 07:48
加载中...