Nu aveti permisiuni pentru a descarca fisierul grader_test18.ok
Cod sursa(job #2969170)
Utilizator | Data | 22 ianuarie 2023 17:26:34 | |
---|---|---|---|
Problema | Cele mai apropiate puncte din plan | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 1.1 kb |
#include <bits/stdc++.h>
using namespace std;
ifstream in("cmap.in");
ofstream out("cmap.out");
vector<pair<double, double>> pts;
int n;
double dx, dy;
double closePair() {
double mini = 1e9, d;
sort(pts.begin(), pts.end());
set<pair<double, double>> s;
int j = 0;
for(int i = 0; i < n; i++) {
d = ceil(mini);
while(pts[i].first - pts[j].first >= d) {
s.erase({pts[j].second, pts[j].first});
j++;
}
auto it1 = s.lower_bound({pts[i].second - d, pts[i].first});
auto it2 = s.upper_bound({pts[i].second + d, pts[i].first});
for(auto it = it1; it != it2; it++) {
dx = pts[i].first - it->second;
dy = pts[i].second - it->first;
mini = min(mini,sqrt(dx * dx + dy * dy));
}
s.insert({pts[i].second, pts[i].first});
}
return mini;
}
int main() {
in >> n;
for(int i = 0; i < n; i++) {
in >> dx >> dy;
pts.push_back({dx, dy});
}
out << setprecision(6) << fixed << closePair();
return 0;
}