#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> p;
const ll N = 200003;
ll n, ans = 1e18;
p a[N];
ll calc(ll x, ll y) {
return (a[x].first - a[y].first)*(a[x].first - a[y].first) + (a[x].second - a[y].second)*(a[x].second - a[y].second);
}
void work(ll l, ll r) {
if(l == r) return;
ll mid = (l + r)/2;
work(l, mid), work(mid + 1, r);
vector<int> b;
for(ll i = l; i <= r; i++)
b.push_back(i);
sort(b.begin(), b.end(), [&](int x, int y) {
return a[x].second < a[y].second;
});
for(ll i = 0; i < b.size(); i++)
for(ll j = i + 1; j < min((ll)b.size(), i + 6ll); j++)//如果对这里有异议,请看下一份代码
ans = min(ans, calc(b[i], b[j]));
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n;
for(int i = 1; i <= n; i++)
cin >> a[i].first >> a[i].second;
sort(a + 1, a + 1 + n);
work(1, n);
cout << ans << endl;
return 0;
}
另一个写法 108分
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> p;
const ll N = 200003;
ll n, ans = 1e18;
p a[N];
ll calc(ll x, ll y) {
return (a[x].first - a[y].first)*(a[x].first - a[y].first) + (a[x].second - a[y].second)*(a[x].second - a[y].second);
}
void work(ll l, ll r) {
if(l == r) return;
ll mid = (l + r)/2;
work(l, mid), work(mid + 1, r);
vector<int> b, c;
for(ll i = l; i <= mid; i++)
b.push_back(i);
for(ll i = mid + 1; i <= r; i++)
c.push_back(i);
auto fun = [&](int x, int y) {
return a[x].second < a[y].second;
};
sort(b.begin(), b.end(), fun);
sort(c.begin(), c.end(), fun);
int j = 0, k = 0;
for(int i = 0; i < b.size(); i++) {
while(j < c.size() && a[c[j]].second < a[b[i]].second) j++;
while(k < c.size() && a[c[k]].second - a[b[i]].second <= sqrt(ans)) k++;
for(int o = j; o < k; o++)
ans = min(ans, calc(b[i], c[o]));
}
j = 0, k = 0;
for(int i = 0; i < c.size(); i++) {
while(j < b.size() && a[b[j]].second < a[c[i]].second) j++;
while(k < b.size() && a[b[k]].second - a[c[i]].second <= sqrt(ans)) k++;
for(int o = j; o < k; o++)
ans = min(ans, calc(c[i], b[o]));
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n;
for(int i = 1; i <= n; i++)
cin >> a[i].first >> a[i].second;
sort(a + 1, a + 1 + n);
work(1, n);
cout << ans << endl;
return 0;
}