Cod sursa(job #2922259)

Utilizator VladNANegoita Vlad-Andrei VladNA Data 7 septembrie 2022 13:00:52
Problema Cele mai apropiate puncte din plan Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.1 kb
#include <bits/stdc++.h>
#define NMAX 100005
#define INF 4e18

#define pii pair <int, int>
#define x first
#define y second
#define ull unsigned long long

#pragma GCC optimize ("Ofast")

using namespace std;

pii v[NMAX];
pii aux[NMAX];
int n;

inline bool cmp(pii p1, pii p2) {
    return p1.y < p2.y;
}

inline ull dist(pii p1, pii p2) {
    return ((ull)p1.x - (ull)p2.x) * ((ull)p1.x - (ull)p2.x) + ((ull)p1.y - (ull)p2.y) * ((ull)p1.y - (ull)p2.y);
}

inline ull distx(pii p1, pii p2) {
    return ((ull)p1.x - (ull)p2.x) * ((ull)p1.x - (ull)p2.x);
}

inline ull disty(pii p1, pii p2) {
    return ((ull)p1.y - (ull)p2.y) * ((ull)p1.y - (ull)p2.y);
}

ull minimum_distance(int left, int right) {

    if (left >= right)
        return INF;

    if (right - left == 1) {
        if (!cmp(v[left], v[right]))
            swap(v[left], v[right]);
        return dist(v[left], v[right]);
    }

    int mid = (right + left) >> 1;
    pii mid_point = v[mid];
    ull d1 = minimum_distance(left, mid);
    ull d2 = minimum_distance(mid + 1, right);
    ull d = min(d1, d2);

    for (int i = left, j = mid + 1, k = left; i <= mid || j <= right;)
        if (j > right || (i <= mid && cmp(v[i], v[j])))
            aux[k++] = v[i++];
        else
            aux[k++] = v[j++];

    vector <pii> points;
    for (int i = left; i <= right; ++i) {
        v[i] = aux[i];
        if (distx(v[i], mid_point) < d)
            points.push_back(v[i]);
    }

    for (int i = 0; i < (int)points.size() - 1; ++i)
        for (int j = i + 1; j < (int)points.size() && disty(points[i], points[j]) < d; ++j)
            d = min(d, dist(points[i], points[j]));

    return d;
}

void solve() {

    cin >> n;
    for (int i = 1; i <= n; ++i)
        cin >> v[i].x >> v[i].y;

    sort(v + 1, v + n + 1);
    cout << minimum_distance(1, n) << '\n';
}

int main()
{
    #ifndef sdbfsf
    freopen("cmap.in", "r", stdin);
    freopen("cmap.out", "w", stdout);
    #endif

    // #ifdef ONLINE_JUDGE
    // ios::sync_with_stdio(false);
    // cin.tie(0);
    // cout.tie(0);
    // #endif

    int t = 1;
    // cin >> t;

    while (t--)
        solve();
    return 0;
}