Skip to content

Commit 50bb91b

Browse files
authored
Update nearest_points.md - patch code error
1 parent 4d47823 commit 50bb91b

File tree

1 file changed

+67
-67
lines changed

1 file changed

+67
-67
lines changed

src/geometry/nearest_points.md

Lines changed: 67 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -213,85 +213,85 @@ using ll = long long;
213213
using ld = long double;
214214

215215
struct RealPoint {
216-
ld x, y;
217-
RealPoint() {}
218-
RealPoint(T x_, T y_) : x(x_), y(y_) {}
216+
ld x, y;
217+
RealPoint() {}
218+
RealPoint(ld x_, ld y_) : x(x_), y(y_) {}
219219
};
220220
using pt = RealPoint;
221221

222222
struct CustomHash {
223-
size_t operator()(const pair<ll,ll>& p) const {
224-
static const uint64_t C = chrono::steady_clock::now().time_since_epoch().count();
225-
return C ^ ((p.first << 32) ^ p.second);
226-
}
223+
size_t operator()(const pair<ll,ll>& p) const {
224+
static const uint64_t C = chrono::steady_clock::now().time_since_epoch().count();
225+
return C ^ ((p.first << 32) ^ p.second);
226+
}
227227
};
228228

229-
ld dist(pt a, pt b) {
230-
ld dx = a.x - b.x;
231-
ld dy = a.y - b.y;
232-
return sqrt(dx*dx + dy*dy);
229+
ld dist(const pt& a, const pt& b) {
230+
ld dx = a.x - b.x;
231+
ld dy = a.y - b.y;
232+
return sqrt(dx*dx + dy*dy);
233233
}
234234

235235
pair<pt,pt> closest_pair_of_points_rand_reals(vector<pt> P) {
236236
const ld eps = 1e-9;
237237

238-
int n = int(P.size());
239-
assert(n >= 2);
240-
unordered_map<pair<ll,ll>,vector<pt>,CustomHash> grid;
241-
grid.reserve(n);
242-
243-
mt19937 rd(chrono::system_clock::now().time_since_epoch().count());
244-
uniform_int_distribution<int> dis(0, n-1);
245-
246-
ld d = dist(P[0], P[1]);
247-
pair<pt,pt> closest = {P[0], P[1]};
248-
249-
auto consider_pair = [&](const pt& a, const pt& b) -> void {
250-
ld ab = dist(a, b);
251-
if (ab + eps < d) {
252-
d = ab;
253-
closest = {a, b};
254-
}
255-
};
256-
257-
for (int i = 0; i < n; ++i) {
258-
int j = dis(rd);
259-
int k = dis(rd);
260-
while (j == k)
261-
k = dis(rd);
262-
consider_pair(P[j], P[k]);
263-
}
264-
265-
for (const pt& p : P)
266-
grid[{ll(p.x/d), ll(p.y/d)}].push_back(p);
267-
268-
for (const auto& it : grid) { // same block
269-
int k = int(it.second.size());
270-
for (int i = 0; i < k; ++i) {
271-
for (int j = i+1; j < k; ++j)
272-
consider_pair(it.second[i], it.second[j]);
273-
}
274-
}
238+
int n = int(P.size());
239+
assert(n >= 2);
240+
unordered_map<pair<ll,ll>,vector<pt>,CustomHash> grid;
241+
grid.reserve(n);
242+
243+
mt19937 prng(chrono::system_clock::now().time_since_epoch().count());
244+
uniform_int_distribution<int> uniform(0, n-1);
245+
246+
ld d = dist(P[0], P[1]);
247+
pair<pt,pt> closest = {P[0], P[1]};
248+
249+
auto consider_pair = [&](const pt& a, const pt& b) -> void {
250+
ld ab = dist(a, b);
251+
if (ab + eps < d) {
252+
d = ab;
253+
closest = {a, b};
254+
}
255+
};
256+
257+
for (int i = 0; i < n; ++i) {
258+
int j = uniform(prng);
259+
int k = uniform(prng);
260+
while (j == k)
261+
k = uniform(prng);
262+
consider_pair(P[j], P[k]);
263+
}
264+
265+
for (const pt& p : P)
266+
grid[{ll(p.x/d), ll(p.y/d)}].push_back(p);
267+
268+
for (const auto& it : grid) { // same block
269+
int k = int(it.second.size());
270+
for (int i = 0; i < k; ++i) {
271+
for (int j = i+1; j < k; ++j)
272+
consider_pair(it.second[i], it.second[j]);
273+
}
274+
}
275275

276-
for (const auto& it : grid) { // adjacent blocks
277-
auto coord = it.first;
278-
for (int dx = 0; dx <= 1; ++dx) {
279-
for (int dy = -1; dy <= 1; ++dy) {
280-
if (dx == 0 and dy == 0) continue;
281-
pair<ll,ll> neighbour = {
282-
coord.first + dx,
283-
coord.second + dy
284-
};
285-
for (const pt& p : it.second) {
286-
if (not grid.count(neighbour)) continue;
287-
for (const pt& q : grid.at(neighbour))
288-
candidate_closest(p, q);
289-
}
290-
}
291-
}
292-
}
293-
294-
return closest;
276+
for (const auto& it : grid) { // adjacent blocks
277+
auto coord = it.first;
278+
for (int dx = 0; dx <= 1; ++dx) {
279+
for (int dy = -1; dy <= 1; ++dy) {
280+
if (dx == 0 and dy == 0) continue;
281+
pair<ll,ll> neighbour = {
282+
coord.first + dx,
283+
coord.second + dy
284+
};
285+
for (const pt& p : it.second) {
286+
if (not grid.count(neighbour)) continue;
287+
for (const pt& q : grid.at(neighbour))
288+
consider_pair(p, q);
289+
}
290+
}
291+
}
292+
}
293+
294+
return closest;
295295
}
296296
```
297297

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy