看了yxc大佬好久的视频,还是没有理解大佬的做法,然后去看了秦淮岸大佬的文字题解,理解了。感谢两位大佬,我终于理解了这个平面最近点对经典问题。
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 10;
const int INF = 0x3f3f3f3f;
struct node {
double x, y;
bool type;
} P[MAXN], temp[MAXN];
bool Cmp1(node a, node b) {
if (a.x == b.x)
return a.y < b.y;
return a.x < b.x;
}
bool Cmp2(node a, node b) {
if (a.y == b.y)
return a.x < b.x;
return a.y < b.y;
}
double Dis(node x, node y) {
if (x.type == y.type)
return INF;
return sqrt((x.x - y.x) * (x.x - y.x) + (x.y - y.y) * (x.y - y.y));
}
double Dfs(int l, int r) {
if (l == r)
return INF;
if (l + 1 == r)
return Dis(P[l], P[r]);
int mid = l + (r - l) / 2;
double ans = min(Dfs(l, mid), Dfs(mid + 1, r));
int k = 0;
for (int i = l; i <= r; i++) {
if (P[i].x - ans <= P[mid].x && P[i].x + ans >= P[mid].x)
temp[++k] = P[i];
}
sort(temp + 1, temp + 1 + k, Cmp2);
for (int i = 1; i <= k; i++) {
for (int j = 1; j < i; j++) {
if (temp[j].y >= temp[i].y + ans)
break;
ans = min(ans, Dis(temp[i], temp[j]));
}
}
return ans;
}
int main() {
//freopen("in", "r", stdin);
cout << fixed << setprecision(3);
int T, n;
cin >> T;
while (T--) {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> P[i].x >> P[i].y;
P[i].type = false;
}
for (int i = n + 1; i <= 2 * n; i++) {
cin >> P[i].x >> P[i].y;
P[i].type = true;
}
sort(P + 1, P + 1 + n * 2, Cmp1);
cout << Dfs(1, n << 1) << endl;
}
return 0;
}