传送门

看了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;
}