| Task: | Closest points |
| Sender: | aalto25k_002 |
| Submission time: | 2025-11-12 17:34:24 +0200 |
| Language: | C++ (C++17) |
| Status: | READY |
| Result: | ACCEPTED |
| test | verdict | time | |
|---|---|---|---|
| #1 | ACCEPTED | 0.00 s | details |
| #2 | ACCEPTED | 0.19 s | details |
| #3 | ACCEPTED | 0.28 s | details |
| #4 | ACCEPTED | 0.24 s | details |
| #5 | ACCEPTED | 0.00 s | details |
| #6 | ACCEPTED | 0.17 s | details |
| #7 | ACCEPTED | 0.00 s | details |
| #8 | ACCEPTED | 0.00 s | details |
| #9 | ACCEPTED | 0.00 s | details |
| #10 | ACCEPTED | 0.14 s | details |
| #11 | ACCEPTED | 0.00 s | details |
| #12 | ACCEPTED | 0.00 s | details |
| #13 | ACCEPTED | 0.14 s | details |
| #14 | ACCEPTED | 0.00 s | details |
| #15 | ACCEPTED | 0.00 s | details |
| #16 | ACCEPTED | 0.17 s | details |
| #17 | ACCEPTED | 0.14 s | details |
| #18 | ACCEPTED | 0.00 s | details |
Code
#include <bits/stdc++.h>
using namespace std;
using Point = pair<int,int>;
long long dist(const Point &p1, const Point &p2) {
long long dx = (long long)p1.first - p2.first;
long long dy = (long long)p1.second - p2.second;
return dx*dx + dy*dy;
}
long long bruteForce(const vector<Point> &P, int n) {
long long min_dist = LLONG_MAX;
for (int i = 0; i < n; i++) {
for (int j = i+1; j < n; j++) {
min_dist = min(min_dist, dist(P[i], P[j]));
}
}
return min_dist;
}
long long stripClosest(const vector<Point> &strip, int size, long long d) {
long long min_dist = d;
for (int i = 0; i < size; i++) {
for (int j = i+1; j < size && (long long)(strip[j].second - strip[i].second)*(strip[j].second - strip[i].second) < min_dist; j++) {
min_dist = min(min_dist, dist(strip[i], strip[j]));
}
}
return min_dist;
}
long long closestUtil(const vector<Point> &Px, const vector<Point> &Py, int n) {
if (n <= 6) {
return bruteForce(Px, n);
}
int mid = n / 2;
Point midPoint = Px[mid];
vector<Point> Pyl, Pyr;
Pyl.reserve(mid);
Pyr.reserve(n - mid);
for (const auto &point : Py) {
if (point.first < midPoint.first || (point.first == midPoint.first && point.second < midPoint.second)) {
Pyl.push_back(point);
} else {
Pyr.push_back(point);
}
}
long long dl = closestUtil(vector<Point>(Px.begin(), Px.begin() + mid), Pyl, mid);
long long dr = closestUtil(vector<Point>(Px.begin() + mid, Px.end()), Pyr, n - mid);
long long d = min(dl, dr);
vector<Point> strip;
for (const auto &p : Py) {
long long dx = (long long)p.first - midPoint.first;
if (dx*dx < d) {
strip.push_back(p);
}
}
return min(d, stripClosest(strip, (int)strip.size(), d));
}
long long closest(vector<Point> &P, int n) {
vector<Point> Px = P;
vector<Point> Py = P;
sort(Px.begin(), Px.end(), [](const Point &a, const Point &b) { return a.first < b.first; });
sort(Py.begin(), Py.end(), [](const Point &a, const Point &b) { return a.second < b.second; });
return closestUtil(Px, Py, n);
}
int main() {
int n; cin >> n;
vector<Point> points(n);
for (int i = 0; i < n; i++) {
cin >> points[i].first >> points[i].second;
}
cout << closest(points, n) << "\n";
return 0;
}Test details
Test 1
Verdict: ACCEPTED
| input |
|---|
| 100 58 36 81 -7 46 49 87 -58 ... |
| correct output |
|---|
| 1 |
| user output |
|---|
| 1 |
Test 2
Verdict: ACCEPTED
| input |
|---|
| 200000 -222 -705 277 680 -436 561 528 -516 ... |
| correct output |
|---|
| 1 |
| user output |
|---|
| 1 |
Test 3
Verdict: ACCEPTED
| input |
|---|
| 200000 -464738043 865360844 465231470 129093134 -276549869 -21946314 111055008 -48821736 ... |
| correct output |
|---|
| 25413170 |
| user output |
|---|
| 25413170 |
Test 4
Verdict: ACCEPTED
| input |
|---|
| 200000 1 513001000 2 689002000 3 785003000 4 799004000 ... |
| correct output |
|---|
| 1000000 |
| user output |
|---|
| 1000000 |
Test 5
Verdict: ACCEPTED
| input |
|---|
| 4 0 0 0 3 3 0 1 1 |
| correct output |
|---|
| 2 |
| user output |
|---|
| 2 |
Test 6
Verdict: ACCEPTED
| input |
|---|
| 200000 1 0 1 1 1 2 1 3 ... |
| correct output |
|---|
| 1 |
| user output |
|---|
| 1 |
Test 7
Verdict: ACCEPTED
| input |
|---|
| 4 1 2 10 3 3 5 8 5 |
| correct output |
|---|
| 8 |
| user output |
|---|
| 8 |
Test 8
Verdict: ACCEPTED
| input |
|---|
| 4 10 6 4 10 8 3 2 3 |
| correct output |
|---|
| 13 |
| user output |
|---|
| 13 |
Test 9
Verdict: ACCEPTED
| input |
|---|
| 2 -999999999 -999999999 999999999 999999999 |
| correct output |
|---|
| 7999999984000000008 |
| user output |
|---|
| 7999999984000000008 |
Test 10
Verdict: ACCEPTED
| input |
|---|
| 200000 0 1 1 1 2 1 3 1 ... |
| correct output |
|---|
| 1 |
| user output |
|---|
| 1 |
Test 11
Verdict: ACCEPTED
| input |
|---|
| 8 1 10000 -1 -10000 2 0 -2 0 ... |
| correct output |
|---|
| 16 |
| user output |
|---|
| 16 |
Test 12
Verdict: ACCEPTED
| input |
|---|
| 3 -1000000000 -1000000000 1000000000 1000000000 0 0 |
| correct output |
|---|
| 2000000000000000000 |
| user output |
|---|
| 2000000000000000000 |
Test 13
Verdict: ACCEPTED
| input |
|---|
| 199999 1 1 2 1 3 1 4 1 ... |
| correct output |
|---|
| 1 |
| user output |
|---|
| 1 |
Test 14
Verdict: ACCEPTED
| input |
|---|
| 4 0 0 5 8 6 1 10000 0 |
| correct output |
|---|
| 37 |
| user output |
|---|
| 37 |
Test 15
Verdict: ACCEPTED
| input |
|---|
| 435 -842 -199 -480 798 -176 -406 792 608 ... |
| correct output |
|---|
| 2 |
| user output |
|---|
| 2 |
Test 16
Verdict: ACCEPTED
| input |
|---|
| 200000 1 0 1 2 1 4 1 6 ... |
| correct output |
|---|
| 4 |
| user output |
|---|
| 4 |
Test 17
Verdict: ACCEPTED
| input |
|---|
| 200000 0 1 2 1 4 1 6 1 ... |
| correct output |
|---|
| 4 |
| user output |
|---|
| 4 |
Test 18
Verdict: ACCEPTED
| input |
|---|
| 3 -1000000000 -1000000000 1000000000 1000000000 1000000000 -1000000000 |
| correct output |
|---|
| 4000000000000000000 |
| user output |
|---|
| 4000000000000000000 |
