36分求教

P1429 平面最近点对(加强版)

Mikemao666 @ 2020-07-29 08:14:44

大数据就直接输出了0.0000。。。

#include <bits/stdc++.h>
using namespace std;
struct god {
    int x;
    int y;
} p[200005],q[200005];
double dis(god x,god y) {
    return sqrt(abs(x.x-y.x)*abs(x.x-y.x)+abs(y.x-y.y)*abs(y.x-y.y));
}
bool cmp(god a,god b){
    return a.x<b.x;
}
double divide(int l,int r) {
    if(l==r)return 1e7;
    int mid=(l+r)>>1;
    double d;
    int tx=p[mid].x;
    int tot(0);
    d=min(divide(l,mid),divide(mid+1,r));
    for(int i=l,j=mid+1; (i<=mid||j<=r); i++) {
        while(j<=r&&(p[i].y>p[j].y||i>mid))
            q[tot++]=p[j],j++;
        if(abs(p[i].x-tx)<d&&i<=mid) {
            for(int k=j-1; k>mid&&j-k<3; k--)
                d=min(d,dis(p[i],p[k]));
            for(int k=j; k<=r&&k-j<2; ++k)
                d=min(d,dis(p[i],p[k]));
        }
        if(i<=mid)q[tot++]=p[i];
    }
    for(int i=l,j=0; i<=r; ++i,++j)p[i]=q[i];
    return d;
}
int n;
int main() {
    cin>>n;
    for(int i=0; i<n; ++i) {
        cin>>p[i].x>>p[i].y;
    }sort(p,p+n,cmp);
    printf("%.4lf",divide(0,n-1));
    return 0;
}

by kcs007 @ 2020-07-29 08:53:23

结构体里用double,输入的是实数


|