1 条题解

  • 0
    @ 2025-6-28 10:01:21
    #include <bits/stdc++.h>
    using namespace std;
    const long long INF = 0x7fffffffffffffffLL;
    const int MAXN = 400000 + 5;
    int n;
    struct Point
    {
        long long x, y;
    };
    Point p[MAXN];
    bool cmpX(Point x, Point y)
    {
        return x.x < y.x;
    }
    bool cmpY(Point x, Point y)
    {
        return x.y < y.y;
    }
    long long dis(int x, int y)
    {
        return (p[x].x - p[y].x) * (p[x].x - p[y].x) +
               (p[x].y - p[y].y) * (p[x].y - p[y].y);
    }
    vector<int> cal;
    long long gao(int l, int r)
    {
        if (l == r)
            return INF;
        int mid = (l + r) / 2;
        long long midx = p[mid].x;
        long long dl = gao(l, mid);
        long long dr = gao(mid + 1, r);
        inplace_merge(p + l, p + mid + 1, p + r + 1, cmpY);
        long long dd = min(dl, dr);
        cal.clear();
        for (int i = l; i <= r; i++)
            if ((p[i].x - midx) * (p[i].x - midx) <= dd)
                cal.push_back(i);
        for (int i = 0; i < cal.size(); i++)
        {
            int ii = cal[i];
            for (int j = i + 1; j < cal.size(); j++)
            {
                int jj = cal[j];
                if ((p[jj].y - p[ii].y) * (p[jj].y - p[ii].y) > dd)
                    break;
                dd = min(dd, dis(ii, jj));
            }
        }
        return dd;
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin >> n;
        for (int i = 1; i <= n; i++)
            cin >> p[i].x >> p[i].y;
        sort(p + 1, p + n + 1, cmpX);
        cout << gao(1, n) << "\n";
        return 0;
    }
    
    • 1

    信息

    ID
    8969
    时间
    350ms
    内存
    512MiB
    难度
    5
    标签
    递交数
    1
    已通过
    1
    上传者