Cod sursa(job #1364037)

Utilizator vtt271Vasile Toncu vtt271 Data 27 februarie 2015 13:46:57
Problema Cele mai apropiate puncte din plan Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <algorithm>
//cele mai apropiate puncte in plan
using namespace std;

double inf = 10000000000000000;

inline double sqr(double x)
{
    return x*x;
}

struct punct{
    double x, y;
};

int n;

double min_dist(punct *A, int left, int right) {
    if(left == right) return inf;
    if(left+1 == right) return sqr(A[left].x - A[right].x) + sqr(A[left].y - A[right].y);
    int mid = (left+right)/2;
    double dist1 = min(min_dist(A, left, mid), min_dist(A, mid, right));

    int s, d;
    s = max(1, mid-7); d = min(mid+7, n);
    double dist2 = sqr(A[s].x - A[d].x) + sqr(A[s].y - A[d].y);

    for(int i = s; i <= d; i++){
        for(int j = i+1; j <= d; j++){
            if( sqr(A[i].x - A[j].x) + sqr(A[i].y - A[j].y) < dist2 ) {
                dist2 = sqr(A[i].x - A[j].x) + sqr(A[i].y - A[j].y);
            }
        }
    }

    return min(dist1, dist2);
}

bool cmp(punct q, punct w)
{
    return q.x <= w.x;
}

int main()
{
    ifstream inFile("cmap.in");
    ofstream outFile("cmap.out");


    inFile >> n;
    punct A[100004];
    double x, y;
    punct p;

    for(int i = 1; i <= n; i++) {
        inFile >> x >> y;
        p.x = x;
        p.y = y;
        A[i] = p;
    }
    sort(A+1, A+1+n, cmp);
    for(int i = 1; i <= n; i++) {
        outFile << A[i].x << " " << A[i].y << "\n";
    }

    outFile << sqrt(min_dist(A, 1, n));

}