#include<bits/stdc++.h>
#define maxn 400010
using namespace std;
long long read(){
long long x=0,sgn=1;char ch=getchar();
while(ch<'0' || ch>'9'){if(ch=='-')sgn=-1;ch=getchar();}
while(ch>='0' && ch<='9'){x=(x<<3)+(x<<1)+(ch&15);ch=getchar();}
return x*sgn;
}
struct node{
long long x,y;
}a[maxn],b[maxn],save[maxn];
long long n;
double ans;
double dis(node n1,node n2){
return sqrt((n1.x-n2.x)*(n1.x-n2.x)+(n1.y-n2.y)*(n1.y-n2.y));
}
bool cmp(node n1,node n2){
return n1.x<n2.x;
}
void mer(long long l,long long r){
if(r-l+1<2)return;
long long mid=(l+r)>>1;
mer(l,mid);
mer(mid+1,r);
long long zuo=l,you=mid+1,tot=0;
while(zuo<=mid||you<=r){
if(zuo<=mid&&(you==r+1||a[zuo].y<a[you].y))
save[++tot]=a[zuo],zuo++;
else save[++tot]=a[you],you++;
}
for(int i=1;i<=tot;i++)a[i+l-1]=save[i];
tot=0;
for(int i=l;i<=r;i++)
if(abs(a[i].x-a[mid].x)<=ans)b[++tot]=a[i];
long long j=1;
for(int i=1;i<=tot;i++){
while(j<tot&&b[j].y-b[i].y<=ans)j++;
for(int k=i+1;k<=j;k++)
ans=min(ans,dis(b[k],b[i]));
}
}
int main(){
n=read();
ans=LONG_LONG_MAX;
for(int i=1;i<=n;i++)
a[i].x=read(),a[i].y=read();
sort(a+1,a+1+n,cmp);
mer(1,n);
printf("%.0lf\n",ans*ans);
return 0;
}
尝试了好久了都过不去。就是分治的思路。有 dl 来看看吗?