Submission #247038

#TimeUsernameProblemLanguageResultExecution timeMemory
247038opukittpceno_hhrDrzava (COCI15_drzava)C++17
72 / 160
1099 ms59496 KiB
#ifndef LOCAL #pragma GCC optimize("Ofast") #pragma GCC optimize("unroll-loops") #endif #include <iostream> #include <vector> #include <map> #include <set> #include <queue> #include <algorithm> #include <string> #include <cmath> #include <cstdio> #include <iomanip> #include <fstream> #include <cassert> #include <cstring> #include <unordered_set> #include <unordered_map> #include <numeric> #include <ctime> #include <bitset> #include <complex> #include <chrono> #include <random> #include <functional> using namespace std; typedef long double ld; #define int long long const int N = 5e4; const int K = 50; int n, k; int X[N]; int Y[N]; int C[N]; int ids[N]; pair<int, int> block[N]; vector<int> by_block[N]; int used[N]; vector<pair<int, int>> seen; int gt(pair<int, int> v) { auto it = lower_bound(seen.begin(), seen.end(), v); if (it != seen.end() && *it == v) { return (int)(it - seen.begin()); } return (int)-1; }; void dfs(int i, vector<int> &c, int mid_int) { c.push_back(C[i]); used[i] = 1; for (int dx = -1; dx <= 1; dx++) { for (int dy = -1; dy <= 1; dy++) { int bl_id = gt({block[i].first + dx, block[i].second + dy}); if (bl_id == -1) continue; for (auto other : by_block[bl_id]) { if (!used[other] && (X[i] - X[other]) * (X[i] - X[other]) + (Y[i] - Y[other]) * (Y[i] - Y[other]) <= mid_int) { dfs(other, c, mid_int); } } } } } int dp[N][K]; bool solve(vector<int> c) { for (int i = 0; i <= (int)c.size(); i++) { for (int j = 0; j < k; j++) { dp[i][j] = -N; } } dp[0][0] = 0; for (int i = 0; i < (int)c.size(); i++) { for (int j = 0; j < k; j++) { if (dp[i][j] == -N) continue; dp[i + 1][(j + c[i]) % k] = max(dp[i + 1][(j + c[i]) % k], dp[i][j] + 1); dp[i + 1][j] = max(dp[i + 1][j], dp[i][j]); } } return dp[(int)c.size()][0] > 0; } bool check(int mid_int) { ld mid = sqrt(mid_int); for (int i = 0; i < n; i++) { by_block[i].clear(); ids[i] = i; } seen.clear(); for (int i = 0; i < n; i++) { ids[i] = i; block[i] = {X[i] / mid, Y[i] / mid}; seen.push_back(block[i]); } sort(ids, ids + n, [&](int i, int j) { return block[i] < block[j]; }); for (int i = 0; i < n; i++) { int r = i; while (r + 1 < n && block[ids[r]] == block[ids[r + 1]]) { r++; } if (r - i + 1 >= 4 * k) { return true; } i = r; } sort(seen.begin(), seen.end()); seen.resize(unique(seen.begin(), seen.end()) - seen.begin()); for (int i = 0; i < n; i++) { by_block[gt(block[i])].push_back(i); } int ans = 0; fill(used, used + n, 0); for (int i = 0; i < n; i++) { if (!used[i]) { vector<int> c; dfs(i, c, mid_int); ans |= solve(c); } } return (bool)ans; } signed main() { ios_base::sync_with_stdio(false); cin.tie(0); cin >> n >> k; for (int i = 0; i < n; i++) { cin >> X[i] >> Y[i] >> C[i]; } int l = 0; int r = 4e18 + 239; while (r - l > 1) { int m = (r + l) >> 1; if (check(m)) { r = m; } else { l = m; } } cout << fixed << setprecision(3); cout << sqrt(r) << endl; }
#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...