Cod sursa(job #1896955)

Utilizator CiurezAndreiCiurez Marius-Andrei CiurezAndrei Data 1 martie 2017 02:17:54
Problema Cele mai apropiate puncte din plan Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.13 kb
#include <bits/stdc++.h>

#define INF 20000000000000

using namespace std;

ifstream fin("harta2.in");
ofstream fout("harta2.out");

pair<int, int> X[1000010], Y[1000010], v[1000010], Z[1000010];
int N;

inline void interclasare(const int &left, const int &middle, const int &right)
{
    int i = left, j = middle + 1, k = 0;

    while(i <= middle && j <= right)
    {
        (Z[i].first <= Z[j].first) ? (Y[++ k] = Z[i ++]) : (Y[++ k] = Z[j ++]);
    }
    while(i <= middle)
        Y[++ k] = Z[i ++];

    while(j <= right)
        Y[++ k] = Z[j ++];

    for(int i = left; i <= right; i ++)
        Z[i] = Y[i - left + 1];
}

inline long long closestPoints(const int &left, const int &right)
{
    if(left >= right)
        return INF;

    if(right - left + 1 == 2)
    {
        if(Z[left] > Z[left + 1])
            swap(Z[left], Z[left + 1]);

        return max(abs(X[left].first - X[left + 1].first), abs(X[left].second - X[left + 1].second));
    }

    int middle = (left + right) >> 1;
    long long solution = min(closestPoints(left, middle), closestPoints(middle, right));
    interclasare(left, middle, right);

    int k = 0;

    for(int i = left; i <= right; i ++)
    {
        if( abs(Z[i].second - X[middle].first) <= solution || abs(X[i].second - X[middle].second) <= solution)
        {
            v[++ k] = Z[i];
        }
    }
    for(int i = 1; i < k; i ++)
    {
        for(int j = i + 1; j <= k && j - i < 8; j ++)
        {
            pair<long long, long long> x = v[i];
            pair<long long, long long> y = v[j];
            solution = min(solution, max( abs(x.first - y.first) , abs(x.second - y.second)));
        }
    }
    return solution;
}

int main()
{
    fin >> N;
    for(int i = 1; i <= N; i ++)
    {
        fin >> X[i].first >> X[i].second;

        X[i].second *= 3;
    }

    sort(X + 1, X + N + 1);
    for(int i = 1; i <= N; i ++)
    {
        Z[i] = make_pair(X[i].second, X[i].first);
    }

    long long solution = closestPoints(1, N);

    fout << setprecision(3) << fixed << (double)solution / 3.0;

    return 0;
}