1 条题解

  • 0
    @ 2026-1-28 23:44:58
    #include<bits/stdc++.h>
    using namespace std;
    const int N=5e5+5;
    struct node{double x,y;int id;}p[N];
    bool cmp(node p1,node p2){if(p1.x!=p2.x)return p1.x<p2.x;else return p1.y<p2.y;}
    double dis(node p1,node p2){return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));}
    int x,y;
    double ans;
    void solve(int l, int r)
    {
        if (l == r) return ;
        int mid = (l + r) >> 1;
        solve(l,mid);
        solve(mid+1, r);
        int tl = mid, tr = mid;
        while (tl >= l && p[mid].x - p[tl].x < ans) tl--; tl++;
        while (tr <= r && p[tr].x - p[mid].x < ans) tr++; tr--;
        for (int i = tl; i < tr; i++)
            for (int j = i + 1; j <= tr; j++)
            {
                double tmp = dis(p[i], p[j]);
                if (tmp < ans)
                {
                    ans = tmp;
                    x = p[i].id; y = p[j].id;
                }
            }
    }
    int main()
    {
        int T;scanf("%d",&T);
        while(T--)  {
            int n;scanf("%d",&n);
            for(int i=1;i<=n;i++)scanf("%lf%lf",&p[i].x,&p[i].y),p[i].id=i;
            sort(p+1,p+n+1,cmp);
            ans=1e18;
            solve(1,n);
            printf("%d %d\n",x-1,y-1);
        }
        return 0;
    }
    
    
    • 1

    *【计算几何】最近点对Closest Pair of Points

    信息

    ID
    3330
    时间
    5000ms
    内存
    1024MiB
    难度
    10
    标签
    (无)
    递交数
    9
    已通过
    1
    上传者