제출 #1176218

#제출 시각아이디문제언어결과실행 시간메모리
1176218avighnaMeetings (JOI19_meetings)C++20
100 / 100
689 ms1044 KiB
#include <bits/stdc++.h> int Query(int u, int v, int w); void Bridge(int u, int v); void Solve(int n) { auto query = [&](int a, int b, int c) { if (a == b or a == c) { return a; } if (b == c) { return b; } return Query(a, b, c); }; auto bridge = [&](int a, int b) { Bridge(std::min(a, b), std::max(a, b)); }; std::random_device rd; std::mt19937 rng(rd()); auto solve = [&](auto &&self, std::vector<int> v) { if (v.size() < 2) { return; } if (v.size() < 3) { bridge(v[0], v[1]); return; } std::uniform_int_distribution<int> dist(0, v.size() - 1); int a = dist(rng); int b = a; while (a == b) { b = dist(rng); } a = v[a], b = v[b]; std::vector<int> path; std::map<int, std::vector<int>> subtree; subtree[a].push_back(a), subtree[b].push_back(b); for (int i = 0; i < v.size(); ++i) { if (v[i] == a or v[i] == b) { continue; } int q = query(a, v[i], b); subtree[q].push_back(v[i]); if (q == v[i]) { path.push_back(v[i]); } } std::sort(path.begin(), path.end(), [&](int i, int j) { return query(a, i, j) == i; }); if (path.empty()) { bridge(a, b); } else { bridge(a, path[0]); for (int i = 1; i < path.size(); ++i) { bridge(path[i - 1], path[i]); } bridge(path.back(), b); } for (auto &[u, sub] : subtree) { self(self, sub); } }; std::vector<int> v(n); std::iota(v.begin(), v.end(), 0); solve(solve, v); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...