Submission #1022867

#TimeUsernameProblemLanguageResultExecution timeMemory
1022867shiomusubi496Toy Train (IOI17_train)C++17
12 / 100
9 ms2496 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) { int n = a.size(), m = u.size(); vector<vector<int>> g(n), rg(n); vector<bool> self_cycle(n); rep (i, m) { if (u[i] == v[i]) self_cycle[u[i]] = true; else { g[u[i]].push_back(v[i]); rg[v[i]].push_back(u[i]); } } auto calc_scc = [&](vector<vector<int>> g) { vector<vector<int>> rg(n); rep (i, n) for (int j : g[i]) rg[j].push_back(i); vector<int> cmp(n, -1); vector<int> ord, used(n); auto dfs = [&](auto self, int v) -> void { used[v] = true; for (int u : g[v]) { if (!used[u]) self(self, u); } ord.push_back(v); }; rep (i, n) if (!used[i]) dfs(dfs, i); reverse(all(ord)); int k = 0; auto rdfs = [&](auto self, int v) -> void { cmp[v] = k; for (int u : rg[v]) { if (cmp[u] == -1) self(self, u); } }; for (int i : ord) { if (cmp[i] == -1) rdfs(rdfs, i), ++k; } return cmp; }; auto cmp = calc_scc(g); { vector<bool> memo(n); vector<int> cmp2; { vector<bool> used(n); queue<int> que; rep (i, n) { if (a[i] == 1) { for (auto j : g[i]) { if (cmp[i] != cmp[j]) used[i] = true; } } else { used[i] = true; for (auto j : g[i]) { if (cmp[i] == cmp[j]) used[i] = false; } if (self_cycle[i]) used[i] = false; } if (r[i] == 1) { used[i] = true; } if (used[i]) que.push(i); } vector<int> deg(n); rep (i, m) { if (u[i] != v[i] && cmp[u[i]] == cmp[v[i]]) ++deg[u[i]]; } while (!que.empty()) { int v = que.front(); que.pop(); for (int u : rg[v]) { if (cmp[u] != cmp[v]) continue; if (used[u]) continue; if (a[u] == 1 || (!self_cycle[u] && (--deg[u]) == 0)) { used[u] = true; que.push(u); } } } // rep (i, n) cout << used[i] << " \n"[i == n - 1]; vector<vector<int>> g(n); rep (i, m) { if (u[i] == v[i]) continue; if (!used[u[i]] && !used[v[i]]) g[u[i]].push_back(v[i]); } cmp2 = calc_scc(g); // rep (i, n) cout << cmp2[i] << " \n"[i == n - 1]; } vector<int> cnt_c2(n); rep (i, n) cnt_c2[cmp2[i]]++; queue<int> que; rep (i, n) { if (a[i] == 0) { // ここが嘘で、これ以外にも r=0 からなる cycle があれば検知しなくてはならない // if (self_cycle[i] && r[i] == 0) { // memo[i] = true; // } if (self_cycle[i] && r[i] == 0) memo[i] = true; else if (cnt_c2[cmp2[i]] >= 2) memo[i] = true; // for (int j : g[i]) { // if (cmp[i] != cmp[j]) { // memo[i] = true; // break; // } // } if (memo[i]) que.push(i); } else { if (cnt_c2[cmp2[i]] >= 2) memo[i] = true; // memo[i] = true; // for (int j : g[i]) { // if (cmp[i] == cmp[j]) { // memo[i] = false; // break; // } // } if (memo[i]) que.push(i); } } // rep (i, n) cout << memo[i] << " \n"[i == n - 1]; vector<int> deg(n); rep (i, m) { if (u[i] == v[i]) continue; /*if (cmp[u[i]] == cmp[v[i]])*/ ++deg[u[i]]; } // rep (i, n) cout << deg[i] << " \n"[i == n - 1]; while (!que.empty()) { int v = que.front(); que.pop(); for (int u : rg[v]) { // if (cmp[u] != cmp[v]) continue; if (memo[u]) continue; if (a[u] == 0 || (--deg[u]) == 0) { memo[u] = true; que.push(u); } } } // rep (i, n) cout << deg[i] << " \n"[i == n - 1]; rep (i, n) { if (self_cycle[i]) continue; if (memo[i]) r[i] = 0; } } { queue<int> que; rep (i, n) { if (r[i] == 1) que.push(i); } vector<int> deg(n); rep (i, m) { if (u[i] != v[i]) ++deg[u[i]]; } while (!que.empty()) { int v = que.front(); que.pop(); for (int u : rg[v]) { if (r[u]) continue; if (a[u] == 1 || (!self_cycle[u] && (--deg[u]) == 0)) { r[u] = true; que.push(u); } } } } return r; }
#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...