#include <iostream>
#include <algorithm>
using namespace std;
struct pos{
long long x;
long long y;
}a[400400];
inline long long dis(long long _x1,long long _y1,long long _x2,long long _y2){
return (_x2-_x1)*(_x2-_x1)+(_y2-_y1)*(_y2-_y1);
}
inline long long min(long long a,long long b){
return a<b?a:b;
}
bool cmp(pos a,pos b){
return a.x*a.x+a.y*a.y>b.x*b.x+b.y*b.y;
}
long long ans=1e18;
int n;
int main(void){
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i].x>>a[i].y;
}
sort(a,a+n,cmp);
for(int i=1;i<n;i++){
for(int j=-100;j<=100;j++){
if(j==0){
j++;
}
if(i+j<0||i+j>=n){
if(j>0){
break;
}
continue;
}
ans=min(ans,dis(a[i+j].x,a[i+j].y,a[i].x,a[i].y));
}
}
cout<<ans;
}
以上代码用排序轻松 AC 了本题。
这题的正解是分治,但是依旧卡了过去,所以请求加强数据。