Submission #761497

#TimeUsernameProblemLanguageResultExecution timeMemory
761497caganyanmazKeys (IOI21_keys)C++17
37 / 100
154 ms21640 KiB
#include <bits/stdc++.h> #define pb push_back using namespace std; constexpr static int SIZE = 2010; vector<array<int, 2>> g[SIZE]; set<array<int, 2>> pending_edges; bitset<SIZE> visited; vector<int> rr; bitset<SIZE> keys; int current_node; void dfs(int node) { visited[node] = true; int key = rr[node]; if (!keys[key]) { keys[key] = true; array<int, 2> sss = {key, 0}; for (auto it = pending_edges.lower_bound(sss); it != pending_edges.end() && (*it)[0] == key; it++) if (!visited[(*it)[1]]) dfs((*it)[1]); } for (auto [c, k] : g[node]) { if (visited[c]) continue; if (keys[k]) dfs(c); else pending_edges.insert({k, c}); } } int find_count(int node) { visited.reset(); keys.reset(); pending_edges.clear(); current_node = node; dfs(node); return visited.count(); } vector<int> find_reachable(vector<int> r, vector<int> u, vector<int> v, vector<int> c) { rr = r; int n = r.size(), m = u.size(); for (int i = 0; i < m; i++) { g[v[i]].pb({u[i], c[i]}); g[u[i]].pb({v[i], c[i]}); } int min_count = INT_MAX; vector<int> counts(n); for (int i = 0; i < n; i++) { counts[i] = find_count(i); min_count = min(min_count, counts[i]); } vector<int> res(n); for (int i = 0; i < n; i++) if (counts[i] == min_count) res[i] = 1; return res; } #ifdef __DEBUG__ int main() { int n, m; cin >> n >> m; vector<int> r(n), u(m), v(m), c(m); for (int& i : r) cin >> i; for (int i = 0; i < m; i++) cin >> u[i] >> v[i] >> c[i]; vector<int> res = find_reachable(r, u, v, c); for (int i : res) cout << i << " "; cout << "\n"; } #endif
#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...