Submission #1217847

#TimeUsernameProblemLanguageResultExecution timeMemory
1217847HappyCapybaraKeys (IOI21_keys)C++17
0 / 100
1 ms328 KiB
#include<bits/stdc++.h> using namespace std; int n, m; vector<int> p, t, s, f; vector<set<int>> keys, unlocked; vector<set<pair<int,int>>> locked; vector<bool> done; int findp(int a){ if (a == p[a]) return p[a]; return p[a] = findp(p[a]); } int findt(int a){ if (a == t[a]) return t[a]; return t[a] = findt(t[a]); } void merget(int a, int b){ a = findt(a); b = findt(b); if (a != b) t[b] = a; } void mergep(int a, int b){ a = findp(a); b = findp(b); p[b] = a; s[a] += s[b]; if (keys[a].size() < keys[b].size()) swap(keys[a], keys[b]); for (int x : keys[b]) keys[a].insert(x); if (unlocked[a].size() < unlocked[b].size()) swap(unlocked[a], unlocked[b]); for (int x : unlocked[b]) unlocked[a].insert(x); if (locked[a].size() < locked[b].size()) swap(locked[a], locked[b]); for (pair<int,int> x : locked[b]) locked[a].insert(x); } void solve(int cur){ //cout << "cur: " << cur << endl; if (done[cur]) return; done[cur] = true; if (cur != findp(cur)) return; vector<pair<int,int>> tbe; for (pair<int,int> x : locked[cur]){ if (keys[cur].find(x.first) != keys[cur].end()) tbe.push_back(x); } for (pair<int,int> x : tbe){ unlocked[cur].insert(x.second); locked[cur].erase(x); } while (!unlocked[cur].empty()){ int next = *unlocked[cur].begin(); unlocked[cur].erase(next); if (findp(next) == cur) continue; f[cur] = next; if (findt(next) != findt(cur)){ merget(cur, next); solve(next); return; } //cout << "cycle: " << next << endl; int pt = next; while (findp(pt) != cur){ int pt2 = f[findp(pt)]; mergep(cur, pt); pt = pt2; } } } vector<int> find_reachable(vector<int> r, vector<int> u, vector<int> v, vector<int> c){ n = r.size(); m = u.size(); p.resize(n); for (int i=0; i<n; i++) p[i] = i; t.resize(n); for (int i=0; i<n; i++) t[i] = i; s.resize(n, 1); f.resize(n); for (int i=0; i<n; i++) f[i] = i; keys.resize(n); for (int i=0; i<n; i++) keys[i].insert(r[i]); unlocked.resize(n); locked.resize(n); for (int i=0; i<m; i++){ if (c[i] == r[u[i]]) unlocked[u[i]].insert(v[i]); else locked[u[i]].insert({c[i], v[i]}); if (c[i] == r[v[i]]) unlocked[v[i]].insert(u[i]); else locked[v[i]].insert({c[i], u[i]}); } for (int k=0; k<20; k++){ done.assign(n, false); for (int i=0; i<n; i++) solve(i); } vector<int> res(n, 0); int ss = n; for (int i=0; i<n; i++){ if (i == findp(i) && i == findp(f[i])) ss = min(ss, s[i]); } for (int i=0; i<n; i++){ if (findp(i) == findp(f[findp(i)]) && s[findp(i)] == ss) res[i] = 1; } return res; }
#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...