Submission #1025462

#TimeUsernameProblemLanguageResultExecution timeMemory
1025462shiomusubi496Toy Train (IOI17_train)C++17
100 / 100
1614 ms2268 KiB
#include "train.h" #include <bits/stdc++.h> #define rep(i, n) for (int i = 0; i < (int)(n); ++i) #define rep2(i, a, b) for (int i = (int)(a); i < (int)(b); ++i) #define rrep(i, n) for (int i = (int)(n) - 1; i >= 0; --i) #define rrep2(i, a, b) for (int i = (int)(b) - 1; i >= (int)(a); --i) #define all(v) begin(v), end(v) using namespace std; template<class T, class U> bool chmin(T& a, const U& b) { return a > b ? a = b, true : false; } template<class T, class U> bool chmax(T& a, const U& b) { return a < b ? a = b, true : false; } using ll = long long; std::vector<int> who_wins(std::vector<int> a, std::vector<int> r, std::vector<int> u, std::vector<int> v) { vector<int> ids(a.size()); iota(all(ids), 0); vector<int> ans(a.size()); while (true) { int n = a.size(), m = u.size(); vector<vector<int>> g(n), rg(n); rep (i, m) { g[u[i]].push_back(v[i]); rg[v[i]].push_back(u[i]); } auto calc = [&](vector<int> r, bool f) -> vector<int> { queue<int> que; rep (i, n) { if (r[i]) que.push(i); } vector<int> deg(n); rep (i, n) deg[i] = g[i].size(); while (!que.empty()) { int i = que.front(); que.pop(); for (int j : rg[i]) { if (r[j]) continue; if (a[j] == f) { r[j] = true; } else { if ((--deg[j]) == 0) { r[j] = true; } } if (r[j]) que.push(j); } } return r; }; auto r2 = calc(r, 1); if (count(all(r2), 1) == n) { rep (i, n) ans[ids[i]] = 1; break; } rep (i, n) r2[i] ^= 1; auto r3 = calc(r2, 0); vector<int> idx(n, -1); vector<int> ids2; int cnt = 0; rep (i, n) { if (!r3[i]) { idx[i] = cnt++; ids2.push_back(ids[i]); } } vector<int> a2(cnt), r4(cnt); rep (i, n) { if (idx[i] == -1) continue; a2[idx[i]] = a[i]; r4[idx[i]] = r[i]; } vector<int> u2, v2; rep (i, m) { if (idx[u[i]] == -1 || idx[v[i]] == -1) continue; u2.push_back(idx[u[i]]); v2.push_back(idx[v[i]]); } rep (i, n) { if (idx[i] == -1) ans[ids[i]] = 0; } a = a2; r = r4; u = u2; v = v2; ids = ids2; } return ans; }
#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...