Submission #827329

#TimeUsernameProblemLanguageResultExecution timeMemory
827329tranxuanbachToy Train (IOI17_train)C++17
16 / 100
7 ms1992 KiB
#include "train.h" #include <bits/stdc++.h> using namespace std; #define fi first #define se second #define For(i, l, r) for (auto i = (l); i < (r); i++) #define ForE(i, l, r) for (auto i = (l); i <= (r); i++) #define FordE(i, l, r) for (auto i = (l); i >= (r); i--) #define bend(a) (a).begin(), (a).end() #define isz(a) ((int)(a).size()) struct edge_t{ int from, to; }; const int N = 5e3 + 5, M = 2e4 + 5; int n, m; int a[N]; // true = A, false = B bool b[N]; // is charging station edge_t edge[M]; vector <int> adj[N], radj[N]; bool has_self_loop[N]; namespace subtask1{ bool check(){ For(i, 0, m){ if (not (edge[i].from == edge[i].to or edge[i].from + 1 == edge[i].to)){ return false; } } return true; } vector <int> solve(){ vector <bool> has_next_edge(n, false); For(i, 0, m){ if (edge[i].from + 1 == edge[i].to){ has_next_edge[edge[i].from] = true; } } vector <int> ans(n); ans[n - 1] = b[n - 1]; FordE(u, n - 2, 0){ if (not has_self_loop[u]){ ans[u] = ans[u + 1]; continue; } if (a[u] and (b[u] or (has_next_edge[u] and ans[u + 1]))){ ans[u] = a[u]; } else if (not a[u] and (not b[u] or (has_next_edge[u] and not ans[u + 1]))){ ans[u] = a[u]; } else{ ans[u] = a[u] ^ 1; } } return ans; } } namespace subtask3{ bool check(){ return *max_element(a, a + n) == 1; } vector <int> vis; vector <int> order; vector <int> cpn; vector <vector <int>> scc; void dfs_topo(int u){ vis[u] = true; for (auto i: adj[u]){ int v = edge[i].to; if (not vis[v]){ dfs_topo(v); } } order.emplace_back(u); } void dfs_cpn(int u){ vis[u] = true; cpn.emplace_back(u); for (auto i: radj[u]){ int v = edge[i].from; if (not vis[v]){ dfs_cpn(v); } } } vector <int> solve(){ vis.assign(n, false); For(u, 0, n){ if (not vis[u]){ dfs_topo(u); } } reverse(bend(order)); vis.assign(n, false); for (auto u: order){ if (vis[u]){ continue; } cpn.clear(); dfs_cpn(u); scc.emplace_back(cpn); } reverse(bend(scc)); vector <int> ans(n, false); for (auto &cpn: scc){ bool has_b = false, ok = false; for (auto u: cpn){ if (b[u]){ has_b = true; } for (auto i: adj[u]){ int v = edge[i].to; if (ans[v]){ ok = true; } } } if (has_b){ if (isz(cpn) >= 2){ ok = true; } for (auto u: cpn){ if (has_self_loop[u]){ ok = true; } } } for (auto u: cpn){ ans[u] = ok; } } return ans; } } vector <int> who_wins(vector <int> _a, vector <int> _r, vector <int> _u, vector <int> _v){ n = isz(_a); m = isz(_u); For(u, 0, n){ a[u] = _a[u]; b[u] = _r[u]; } For(i, 0, m){ int u = _u[i], v = _v[i]; edge[i] = edge_t{u, v}; adj[u].emplace_back(i); radj[v].emplace_back(i); } For(i, 0, m){ auto [u, v] = edge[i]; if (u == v){ has_self_loop[u] = true; } } if (subtask1::check()){ return subtask1::solve(); } if (subtask3::check()){ return subtask3::solve(); } return vector <int>(n); }
#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...