Submission #1188186

#TimeUsernameProblemLanguageResultExecution timeMemory
1188186anmattroiToy Train (IOI17_train)C++17
11 / 100
4 ms1860 KiB
#include "train.h" #include <bits/stdc++.h> #define maxn 5005 using namespace std; int selfLoop[maxn]; vector<int> adj[maxn], Stack, g[maxn]; int cl[maxn], num[maxn], low[maxn], lt[maxn], slt = 0, cool[maxn], id = 0, charged[maxn]; void pfs(int u) { num[u] = low[u] = ++id; cl[u] = 1; Stack.emplace_back(u); for (int v : adj[u]) if (!cl[v]) { pfs(v); low[u] = min(low[u], low[v]); } else if (cl[v] == 1) low[u] = min(low[u], num[v]); if (num[u] == low[u]) { ++slt; int hasCharged = 0, sz = 0; int v; do { v = Stack.back(); ++sz; hasCharged |= (charged[v]); Stack.pop_back(); cl[v] = 2; lt[v] = slt; } while (v != u); cool[slt] = ((sz > 1 || (selfLoop[v])) && (hasCharged)); } } vector<int> who_wins(vector<int> a, vector<int> r, vector<int> u, vector<int> v) { int n = a.size(), m = u.size(); for (int i = 0; i < m; i++) { if (u[i] == v[i]) selfLoop[u[i]] = 1; else adj[u[i]].emplace_back(v[i]); } for (int i = 0; i < n; i++) charged[i] = r[i]; for (int i = 0; i < n; i++) if (!cl[i]) pfs(i); for (int i = 0; i < m; i++) if (lt[u[i]] != lt[v[i]]) g[lt[u[i]]].emplace_back(lt[v[i]]); for (int i = 1; i <= slt; i++) for (int j : g[i]) { assert(j < i); cool[i] |= cool[j]; } vector<int> ans; for (int i = 0; i < n; i++) ans.emplace_back(cool[lt[i]]); 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...