Cod sursa(job #2969170)

Utilizator 2016Teo@Balan 2016 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;
}