On this page
article
Closest pair of points
Sobre
O(nlogn)
Link original: closestPairOfPoints.cpp
Código
pair<pt, pt> closest_pair_of_points(vector<pt> v) {
int n = v.size();
sort(v.begin(), v.end());
for (int i = 1; i < n; i++) if (v[i] == v[i-1]) return {v[i-1], v[i]};
auto cmp_y = [&](const pt &l, const pt &r) {
if (l.y != r.y) return l.y < r.y;
return l.x < r.x;
};
set<pt, decltype(cmp_y)> s(cmp_y);
int l = 0, r = -1;
ll d2_min = numeric_limits<ll>::max();
pt pl, pr;
const int magic = 5;
while (r+1 < n) {
auto it = s.insert(v[++r]).first;
int cnt = magic/2;
while (cnt-- and it != s.begin()) it--;
cnt = 0;
while (cnt++ < magic and it != s.end()) {
if (!((*it) == v[r])) {
ll d2 = dist2(*it, v[r]);
if (d2_min > d2) {
d2_min = d2;
pl = *it;
pr = v[r];
}
}
it++;
}
while (l < r and sq(v[l].x-v[r].x) > d2_min) s.erase(v[l++]);
}
return {pl, pr};
}