제출 #247028

#제출 시각아이디문제언어결과실행 시간메모리
247028opukittpceno_hhrDrzava (COCI15_drzava)C++17
0 / 160
8 ms2816 KiB
#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 = 30; 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<int> g[N]; void dfs(int cur, vector<int> &c) { // cerr << "dsf " << cur << endl; c.push_back(C[cur]); used[cur] = 1; for (auto t : g[cur]) { if (!used[t]) { dfs(t, c); } } } 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); // cerr << "mid " << mid << endl; for (int i = 0; i < n; i++) { g[i].clear(); by_block[i].clear(); ids[i] = i; } vector<pair<int, int>> seen; 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()); function<int(pair<int, 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; }; for (int i = 0; i < n; i++) { by_block[gt(block[i])].push_back(i); } // cerr << "hr " << endl; for (int i = 0; i + 1 < n; i++) { 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 ((X[i] - X[other]) * (X[i] - X[other]) + (Y[i] - Y[other]) * (Y[i] - Y[other]) <= mid_int) { g[i].push_back(other); } } } } } // cerr << "hr " << endl; int ans = 0; fill(used, used + n, 0); for (int i = 0; i < n; i++) { if (!used[i]) { vector<int> c; dfs(i, c); // cerr << "c: " << endl; // for (auto x : c) { // cerr << x << ' '; // } // cerr << endl; // cerr << "solve " << endl; ans |= solve(c); // cerr << "-solve" << endl; } } 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; } } // cerr << check(32) << endl; cout << fixed << setprecision(6); 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...