rt,因未知原因答案多了一点,用的是分治。
#include<bits/stdc++.h>
#define x first
#define y second
#define int long long
using namespace std;
int n;
const int N = 4e5 + 5;
pair<int,int> a[N];
inline bool cmp(int p,int q){
return (a[p].y == a[q].y)?a[p].x < a[q].x:a[p].y < a[q].y;
}
inline int dist(int p,int q){
return (a[p].x - a[q].x) * (a[p].x - a[q].x) + (a[p].y - a[q].y) * (a[p].y - a[q].y);
}
inline int cdq(int l,int r){
if (r - l == 1){
return dist(l,r);
}
if (r == l){
return 1e18;
}
int mid = (l + r) / 2;
int d = min(cdq(l,mid),cdq(mid + 1,r));
vector<int> v;
for (int i = l;i <= r;i++){
if (abs(a[i].x - a[mid].x) * abs(a[i].x - a[mid].x) < d){
v.push_back(i);
}
}
sort(v.begin(),v.end(),cmp);
for (int i = 0;i < v.size();i++){
for (int j = i + 1;j < v.size() && dist(v[i],v[j]) < d;j++){
d = dist(v[i],v[j]);
}
}
return d;
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0);
cin >> n;
for (int i = 0;i < n;i++){
cin >> a[i].x >> a[i].y;
}
sort(a,a + n);
cout << cdq(0,n - 1);
return 0;
}