Submission #1234206

#TimeUsernameProblemLanguageResultExecution timeMemory
1234206caterpillowDrzava (COCI15_drzava)C++17
160 / 160
449 ms39032 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;
const ll inf = 1e9;

struct DSU {
	vector<int> e; 
	void init(int n) { 
		e.resize(n, -1);
	}
	int operator[](int x) { 
		return e[x] < 0 ? x : e[x] = (*this)[e[x]]; 
	}   
	bool operator()(int x, int y) {
		x = (*this)[x], y = (*this)[y]; 
		if (x == y) return 0;
		if (e[x] > e[y]) swap(x,y);
		e[x] += e[y]; 
		e[y] = x; 
		return 1;
	}
	// optional
	bool same_set(int a, int b) { return (*this)[a] == (*this)[b]; }
	int sz(int x) { return -e[(*this)[x]]; }
	int add() { e.push_back(-1); return size(e) - 1; }
};

using P = array<int, 3>;
struct Node {
    #define _sq(x) (x) * (x)
    P lo, hi;
    struct Node *lc, *rc;

    ll dist2(const P &a, const P &b) const { 
        return 1ll * _sq(a[0] - b[0]) + 1ll * _sq(a[1] - b[1]); 
    }

    ll dist2(P &p) {
		#define _loc(i) (p[i] < lo[i] ? lo[i] : (p[i] > hi[i] ? hi[i] : p[i]))
		return dist2(p, {_loc(0), _loc(1)});
    }

    template<class ptr>
    Node (ptr l, ptr r, int d) : lc(0), rc(0) {
        lo = {inf, inf, inf}, hi = {-inf, -inf, -inf};
        for (ptr p = l; p < r; p++) {
            for (int i = 3; i--;) lo[i] = min(lo[i], (*p)[i]), hi[i] = max(hi[i], (*p)[i]);
        }
        if (r - l == 1) return;
        ptr m = l + (r - l) / 2;
        nth_element(l, m, r, [&] (auto a, auto b) { return a[d] < b[d]; });
        lc = new Node(l, m, d ^ 1);
        rc = new Node(m, r, d ^ 1);
    }

    void search(P p, priority_queue<pair<ll, int>> &pq) {
        if (lc) {
            ll dl = lc->dist2(p), dr = rc->dist2(p);
            if (dl > dr) swap(lc, rc), dr = dl;
            lc->search(p, pq);
            if (dr < pq.top().first) rc->search(p, pq);
        } else pq.push({dist2(p, lo), lo[2]}), pq.pop();
    }
};

int main() {
	cin.tie(0)->sync_with_stdio(0);
	
	int n, k;
	cin >> n >> k;
    vector<P> pts(n);
    vector<ll> w(n);
    for (int i = 0; i < n; i++) {
        cin >> pts[i][0] >> pts[i][1] >> w[i];
        w[i] %= k;
        pts[i][2] = i;
    }
    Node node(pts.begin(), pts.end(), 0);

    vector<tuple<ll, int, int>> candidate_edges, edges;
    for (int i = 0; i < n; i++) {
        int id = pts[i][2];
        priority_queue<pair<ll, int>> pq;
        for (int j = k; j--;) pq.push({inf * inf, -1});
        node.search(pts[i], pq);
        while (pq.size()) {
            auto [dist, id0] = pq.top(); pq.pop();
            if (id0 == -1) continue;
            candidate_edges.push_back({dist, id, id0});
        }
    }
    sort(candidate_edges.begin(), candidate_edges.end());
    DSU dsu;
    dsu.init(n);
    for (auto [dist, u, v] : candidate_edges) {
        if (dsu(u, v)) edges.push_back({dist, u, v});
    }
    ll lo = 0, hi = inf * inf;
    while (hi - lo > 1) {
        ll m = (lo + hi) / 2;

        DSU dsu;
        dsu.init(n);
        for (auto [dist, u, v] : edges) {
            if (dist > m) break;
            dsu(u, v);
        }
        vector<ll> msk(n, 1);
        int good = 0;
        for (int i = 0; i < n; i++) {
            int j = dsu[i];
            msk[j] |= (msk[j] << w[i]);
            msk[j] |= msk[j] >> k;
            good |= 1 & (msk[j] >> k);
        }
        if (good) hi = m;
        else lo = m;
    }
    cout << fixed << setprecision(3) << sqrtl(hi) << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...