Submission #1152305

#TimeUsernameProblemLanguageResultExecution timeMemory
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...