熊恒锐 • 10天前
#include <bits/stdc++.h>
using namespace std;
struct point {
double x, y;
} pl[50001];
bool cmpx(point p1, point p2) {
return p1.x < p2.x;
}
bool cmpy(point p1, point p2) {
return p1.y < p2.y;
}
int n;
double dis(point p1, point p2) {
return sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
}
double solve(int left, int right) {
if (left == right)
return 1e18;
int mid = (left + right) / 2;
double ans = min(solve(left, mid), solve(mid + 1, right));
vector<point>p;
for (int i = mid; i >= left; i--) {
if (pl[mid].x - pl[i].x <= ans) {
p.push_back(pl[i]);
}
}
for (int i = mid + 1; i <= right; i++) {
if (pl[i].x - pl[mid].x <= ans) {
p.push_back(pl[i]);
}
}
sort(p.begin(), p.end(), cmpy);
for (int i = 0; i < p.size(); i++) {
for (int j = i + 1; j < p.size() && p[j].y - p[i].y < ans; j++) {
ans = min(ans, dis(p[i], p[j]));
}
}
return ans;
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++)
cin >> pl[i].x;
for (int i = 1; i <= n; i++)
cin >> pl[i].y;
sort(pl + 1, pl + n + 1, cmpx);
printf("%.4lf", solve(1, n));
return 0;
}
评论:
请先登录,才能进行评论