144分WA求助

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

D0000 @ 2023-11-11 10:37:02

#include<cstdio>
#include<algorithm>
#include<cmath>
struct node{
    long long x,y;
}a[400005],b[400005],ss[400005];
long long ans=(long long)(2e14);
int n;
bool cmp(node x,node y){
    return x.x<y.x;
}
long long min(long long x,long long y){
    return x>y?y:x;
}
long long abs(long long x){
    return x>-x?x:-x;
}
void gb(int l,int r){
    if(l==r)return;
    int mid=(l+r)>>1;
    gb(l,mid);gb(mid+1,r);
    int i=l,j=mid+1,cnt=0,k=l;
    while(i<=mid||j<=r){
        int now;
        if(i>mid)now=j++;
        else if(j>r)now=i++;
        else if(a[i].y<a[j].y)now=i++;
        else now=j++;
        ss[k].x=a[now].x;
        ss[k++].y=a[now].y;
        if((fabs(a[mid].x-a[now].x)<sqrt(ans)*28))b[++cnt].x=a[now].x,b[cnt].y=a[now].y;
    }
    for(int i=l;i<=r;i++)a[i].x=ss[i].x,a[i].y=ss[i].y;

    for(int i=1;i<cnt;i++){
        for(int j=i+1;j<=cnt&&b[j].y-b[i].y<sqrt(ans);j++){
            ans=min(ans,(b[j].x-b[i].x)*(b[j].x-b[i].x)+(b[j].y-b[i].y)*(b[j].y-b[i].y));
        }
    }
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%lld%lld",&a[i].x,&a[i].y);
    std::sort(a+1,a+n+1,cmp);
    gb(1,n);printf("%lld",(ans));

} 

|