Submission #561653

#TimeUsernameProblemLanguageResultExecution timeMemory
561653iancu장난감 기차 (IOI17_train)C++14
100 / 100
437 ms1620 KiB
#include "train.h" #include <vector> #include <queue> using namespace std; vector<int> who_wins(vector<int> a, vector<int> r, vector<int> u, vector<int> v) { int n = a.size(), m = u.size(); vector<int> w(n, false); vector<bool> curr(n, true); vector<vector<int>> prv(n, vector<int>()), nxt(n, vector<int>()); for (int i = 0; i < m; ++i) { prv[v[i]].push_back(u[i]); nxt[u[i]].push_back(v[i]); } while (true) { vector<bool> s(n, false); queue<int> q; for (int i = 0; i < n; ++i) if (curr[i] && r[i]) { s[i] = true; q.push(i); } while (!q.empty()) { auto y = q.front(); q.pop(); for (auto x: prv[y]) if (curr[x] && !s[x]) { if (!a[x]) { bool isGood = true; for (auto z: nxt[x]) if (curr[z] && !s[z]) { isGood = false; break; } if (!isGood) continue; } s[x] = true; q.push(x); } } bool allS = true; for (int i = 0; i < n; ++i) if (s[i] != curr[i]) { allS = false; break; } if (allS) { for (int i = 0; i < n; ++i) w[i] = s[i]; break; } vector<bool> nonS(n, false); for (int i = 0; i < n; ++i) if (curr[i]) nonS[i] = !s[i]; for (int i = 0; i < n; ++i) if (curr[i] && nonS[i]) q.push(i); while (!q.empty()) { auto y = q.front(); q.pop(); for (auto x: prv[y]) if (curr[x] && !nonS[x]) { if (a[x]) { bool isGood = true; for (auto z: nxt[x]) if (curr[z] && !nonS[z]) { isGood = false; break; } if (!isGood) continue; } nonS[x] = true; q.push(x); } } for (int i = 0; i < n; ++i) if (curr[i] && nonS[i]) curr[i] = false; } return w; }
#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...