제출 #1152305

#제출 시각아이디문제언어결과실행 시간메모리
1152305jmuzhenOdašiljači (COCI20_odasiljaci)C++20
42 / 70
8 ms7816 KiB
#include<bits/stdc++.h>
using namespace std;

#define int long long
typedef long long ll;

struct node {
    int s, e;
    ll mn, mx, sum;
    bool lset;
    ll add_val, set_val;
    node *l, *r;

    node(int _s, int _e, int A[] = nullptr) : s(_s), e(_e), mn(0), mx(0), sum(0), lset(0), add_val(0), set_val(0),
                                              l(nullptr), r(nullptr) {
        if (A == nullptr) return;
        if (s == e) mn = mx = sum = A[s];
        else {
            l = new node(s, (s + e) >> 1, A), r = new node((s + e + 2) >> 1, e, A);
            combine();
        }
    }

    void create_children() {
        if (s == e) return;
        if (l != nullptr) return;
        int m = (s + e) >> 1;
        l = new node(s, m);
        r = new node(m + 1, e);
    }

    void self_set(ll v) {
        lset = true;
        mn = mx = set_val = v;
        sum = v * (e - s + 1);
        add_val = 0;
    }

    void self_add(ll v) {
        if (lset) {
            self_set(v + set_val);
            return;
        }
        mn += v, mx += v, add_val += v;
        sum += v * (e - s + 1);
    }

    void lazy_propagate() {
        if (s == e) return;
        if (lset) {
            l->self_set(set_val), r->self_set(set_val);
            lset = set_val = 0;
        }
        if (add_val != 0) {
            l->self_add(add_val), r->self_add(add_val);
            add_val = 0;
        }
    }

    void combine() {
        if (l == nullptr) return;
        sum = l->sum + r->sum;
        mn = min(l->mn, r->mn);
        mx = max(l->mx, r->mx);
    }

    void add(int x, int y, ll v) {
        if (s == x && e == y) {
            self_add(v);
            return;
        }
        int m = (s + e) >> 1;
        create_children();
        lazy_propagate();
        if (x <= m) l->add(x, min(y, m), v);
        if (y > m) r->add(max(x, m + 1), y, v);
        combine();
    }

    void set(int x, int y, ll v) {
        if (s == x && e == y) {
            self_set(v);
            return;
        }
        int m = (s + e) >> 1;
        create_children();
        lazy_propagate();
        if (x <= m) l->set(x, min(y, m), v);
        if (y > m) r->set(max(x, m + 1), y, v);
        combine();
    }

    ll range_sum(int x, int y) {
        if (s == x && e == y) return sum;
        if (l == nullptr || lset) return (sum / (e - s + 1)) * (y - x + 1);
        int m = (s + e) >> 1;
        lazy_propagate();
        if (y <= m) return l->range_sum(x, y);
        if (x > m) return r->range_sum(x, y);
        return l->range_sum(x, m) + r->range_sum(m + 1, y);
    }

    ll range_min(int x, int y) {
        if (s == x && e == y) return mn;
        if (l == nullptr || lset) return mn;
        int m = (s + e) >> 1;
        lazy_propagate();
        if (y <= m) return l->range_min(x, y);
        if (x > m) return r->range_min(x, y);
        return min(l->range_min(x, m), r->range_min(m + 1, y));
    }

    ll range_max(int x, int y) {
        if (s == x && e == y) return mx;
        if (l == nullptr || lset) return mx;
        int m = (s + e) >> 1;
        lazy_propagate();
        if (y <= m) return l->range_max(x, y);
        if (x > m) return r->range_max(x, y);
        return max(l->range_max(x, m), r->range_max(m + 1, y));
    }

    ~node() {
        // note: deleting nullptr has no effect
        delete l;
        delete r;
    }
};

using ii = pair<int, int>;
vector<ii> points, pointsy;

node *rooty, *rootymin, *rootymax;

inline double dist(ii a, ii b) {
    return sqrt(pow(a.first - b.first, 2) + pow(a.second - b.second, 2));
}

constexpr int INF = 1e12;

signed main() {
    int n; cin >> n;
    rootymin = new node(0, 1e9);
    rootymin->set(0, 1e9, INF);
    rootymax = new node(0, 1e9);
    rootymax->set(0, 1e9, -INF);

    for (int i = 0; i < n; i++) {
        int x, y; cin >> x >> y;
        points.push_back({x, y});
        rootymin->set(x, x, min(rootymin->range_min(x,x), y));
        rootymax->set(x, x, max(rootymax->range_max(x,x), y));
    }

    // // sort by increasing y
    // sort(points.begin(), points.end(), [](const ii&a, const ii&b)
    // {
    //     return a.second<b.second;
    // });

    double global_ans = 0;
    for (int i = 0; i < n; i++) {
        auto p1 = points[i];
        double local_ans = INF;
        for (int j = 0; j < n; j++) {
            if (i==j) continue;
            auto p2 = points[j];
            local_ans = min(local_ans, dist(p1, p2));
        }
        global_ans = max(global_ans, local_ans / 2);
    }

    cout << setprecision(8) << global_ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...