Submission #252793

#TimeUsernameProblemLanguageResultExecution timeMemory
252793islingrDrzava (COCI15_drzava)C++14
160 / 160
299 ms5236 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using ld = long double; #define rep(i, a, b) for (auto i = (a); i < (b); ++i) #define trav(e, x) for (auto &e : x) #define eb(x...) emplace_back(x) #define all(x) begin(x), end(x) #define sz(x) int((x).size()) #define lb(x...) lower_bound(x) #define f first #define s second template<class T> bool ckmin(T& a, const T& b) { return a > b ? a = b, 1 : 0; } template<class T> bool ckmax(T& a, const T& b) { return a < b ? a = b, 1 : 0; } const int N = 1 << 16, K = 1 << 6; const ll inf = 2e8; short k; int n, cur; vector<int> cmp[N]; bool dp[K][K]; int nxt[N], rnk[N]; int head(int u) { return nxt[u] < 0 ? u : nxt[u] = head(nxt[u]); } void unite(int u, int v) { u = head(u); v = head(v); if (u == v) return; if (rnk[u] > rnk[v]) nxt[v] = u; else { nxt[u] = v; if (rnk[u] == rnk[v]) ++rnk[v]; } } using pii = pair<int, int>; pair<pii, short> tmp[N]; pii p(int i) { return tmp[i].f; } short v(int i) { return tmp[i].s; } ll norm(const pii &p, const pii &q) { return 1ll * (p.f - q.f) * (p.f - q.f) + 1ll * (p.s - q.s) * (p.s - q.s); } bool f(ll d) { int r = floor(sqrt(ld(d))); set<pair<int, int>> S; int l = 0; rep(u, 0, n) nxt[u] = rnk[u] = -1, cmp[u].clear(); rep(i, 0, n) { while (p(i).f - p(l).f > r) S.erase({p(l).s, l}), ++l; int cnt = 0; for (auto it = S.lb({p(i).s - r, -1}); it != end(S) && it->f - r <= p(i).s; ++it) { if (norm(p(it->s), p(i)) <= d) { unite(it->s, i); if (++cnt > k) return true; } } S.insert({p(i).s, i}); } rep(u, 0, n) cmp[head(u)].eb(u); rep(z, 0, n) { auto &a = cmp[z]; int n = sz(a); if (a.empty()) continue; if (sz(a) > k) return true; rep(i, 0, n) rep(w, 0, k) dp[i][w] = 0; dp[0][v(a[0])] = 1; rep(i, 1, n) { dp[i][v(a[i])] = 1; rep(w, 0, k) if (dp[i - 1][w]) dp[i][(w + v(a[i])) % k] = dp[i][w] = true; if (dp[i][0]) return true; } } return false; } signed main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> k; rep(i, 0, n) { int x, y, c; cin >> x >> y >> c; tmp[i] = {{x, y}, c % k}; } sort(tmp, tmp + n); ll l = 0, r = inf * inf; while (r - l > 1) { ll m = l + (r - l + 1) / 2; (f(m) ? r : l) = m; } cout << fixed << setprecision(3) << sqrt(ld(r)); }
#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...