제출 #838516

#제출 시각아이디문제언어결과실행 시간메모리
838516thimote75Toy Train (IOI17_train)C++14
11 / 100
1245 ms1832 KiB
#include "train.h" #include <bits/stdc++.h> using namespace std; using idata = vector<int>; using bdata = vector<bool>; using igrid = vector<idata>; idata controller, charger; int N, M; igrid roads; idata visited; int stage = 1; bdata status; bool dfs (int msk) { int node = msk >> 1; int type = msk & 1; if (visited[msk] >= stage) return status[msk]; visited[msk] = stage; if (type == 1 && visited[msk - 1] == stage) { status[msk] = true; visited[msk] = stage + 1; return true; } status[msk] = false; bool rstatus = controller[node] == 0; for (int next : roads[node]) { int nxt_msk = next * 2 + type; bool result = dfs(nxt_msk); if (charger[node] == 1 && !result && type == 0) result |= dfs(nxt_msk + 1); if (controller[node] == 1 && result) { rstatus = true; break ; } if (controller[node] == 0 && !result) { rstatus = false; break ; } } status[msk] = rstatus; visited[msk] = stage + 1; return status[msk]; } idata who_wins(idata _controller, idata _charger, idata u, idata v) { N = _controller.size(); M = u.size(); controller = _controller; charger = _charger; roads.resize(N); for (int i = 0; i < M; i ++) roads[u[i]].push_back(v[i]); visited.resize(2 * N); status .resize(2 * N); idata answer(N, false); for (int i = 0; i < N; i ++) { answer[i] = dfs(2 * i); stage += 2; } return answer; }
#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...