제출 #641670

#제출 시각아이디문제언어결과실행 시간메모리
641670piOOE장난감 기차 (IOI17_train)C++17
5 / 100
1721 ms1632 KiB
#include <bits/stdc++.h> #include "train.h" using namespace std; using ll = long long; constexpr int N = 5000; vector<int> g[N]; bool dp[N]; int used[N], T = 0; vector<int> stk, last; int in_stk[N]; vector<int> r, a; void dfs(int v) { used[v] = T; in_stk[v] = stk.size(); stk.push_back(v); if (r[v]) { last.push_back(last.size() - 1); } else { last.push_back(last.back()); } for (int to: g[v]) { if (in_stk[to] != -1) { if (a[v] ^ (last.back() < in_stk[to])) { dp[v] = true; } } else { if (used[to] != T) { dfs(to); } if (a[v] ^ a[to] ^ dp[to]) { dp[v] = true; } } } stk.pop_back(); last.pop_back(); in_stk[v] = -1; }; std::vector<int> who_wins(std::vector<int> a, std::vector<int> r, std::vector<int> A, std::vector<int> B) { ::a = a, ::r = r; int n = a.size(), m = A.size(); for (int i = 0; i < m; ++i) { g[A[i]].push_back(B[i]); } memset(in_stk, -1, sizeof(in_stk)); last = {-1}; vector<int> ans(n); for (int root = 0; root < n; ++root) { ++T; memset(dp, 0, sizeof(dp)); dfs(root); ans[root] = dp[root] ^ a[root] ^ 1; } 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...