Submission #1213432

#TimeUsernameProblemLanguageResultExecution timeMemory
1213432omsincoconutKeys (IOI21_keys)C++17
9 / 100
3096 ms24808 KiB
#include <bits/stdc++.h> using namespace std; vector<int> find_reachable(vector<int> r, vector<int> u, vector<int> v, vector<int> c) { int n = r.size(), m = u.size(); vector<vector<pair<int, int>>> edge(n); for (int i = 0; i < m; i++) { edge[u[i]].emplace_back(v[i], c[i]); edge[v[i]].emplace_back(u[i], c[i]); } vector<int> p(n); for (int i = 0; i < n; i++) { queue<int> bfs; vector<vector<int>> pending(n); vector<int> colored(n), vis(n); bfs.push(i); while (!bfs.empty()) { int u = bfs.front(); bfs.pop(); if (vis[u]) continue; vis[u] = true; if (!colored[r[u]]) { colored[r[u]] = true; for (int v : pending[r[u]]) bfs.push(v); pending[r[u]].clear(); } for (auto [v, c] : edge[u]) { if (colored[c]) bfs.push(v); else pending[c].push_back(v); } } p[i] = accumulate(vis.begin(), vis.end(), 0); } int min_p = *min_element(p.begin(), p.end()); vector<vector<int>> edge2(n); for (int i = 0; i < m; i++) { if (r[u[i]] == c[i]) edge2[u[i]].push_back(v[i]); if (r[v[i]] == c[i]) edge2[v[i]].push_back(u[i]); } vector<int> p2(n); for (int i = 0; i < n; i++) { queue<int> bfs; vector<int> vis(n); bfs.push(i); while (!bfs.empty()) { int u = bfs.front(); bfs.pop(); if (vis[u]) continue; vis[u] = true; for (int v : edge2[u]) { bfs.push(v); } } p2[i] = accumulate(vis.begin(), vis.end(), 0); } int min_p2 = *min_element(p2.begin(), p2.end()); vector<vector<int>> edge3(n); for (int i = 0; i < m; i++) { edge3[u[i]].push_back(v[i]); edge3[v[i]].push_back(u[i]); } vector<int> compid(n, -1); int compcnt = 0; for (int i = 0; i < n; i++) { if (compid[i] > -1) continue; queue<int> bfs; bfs.push(i); while (!bfs.empty()) { int u = bfs.front(); bfs.pop(); if (compid[u] > -1) continue; compid[u] = compcnt; for (int v : edge3[u]) { bfs.push(v); } } compcnt++; } vector<vector<int>> comp(compcnt); for (int i = 0; i < n; i++) comp[compid[i]].push_back(i); vector<int> candidate; for (vector<int> cc : comp) { int mp2 = (int)1e9; for (int v : cc) mp2 = min(mp2, p2[v]); for (int v : cc) if (p2[v] == mp2) candidate.push_back(v); } int mimi = (int)1e9; for (int v : candidate) mimi = min(mimi, p2[v]); vector<int> ret(n); for (int v : candidate) if (p2[v] == mimi) ret[v] = true; return ret; }
#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...