제출 #572602

#제출 시각아이디문제언어결과실행 시간메모리
572602cjoa장난감 기차 (IOI17_train)C++14
100 / 100
743 ms1456 KiB
#include "train.h" #include <queue> #include <algorithm> #include <iostream> #include <cassert> using namespace std; using VI = vector<int>; using VVI = vector<VI>; enum Player { Arezou = 1, Borzou = 0 }; enum State { UNKNOWN = -1, LOSING = 0, POSSIBLY_WINNING = 1 }; int N, M; VVI G; VI in_deg; VI owner; void bfs(int player, const VI& sources, vector<int>& states) { queue<int> q; for (int i : sources) q.push(i); VI num_neighbors_required(G.size()); for (int i = 0; i < N; i++) { if (states[i] == UNKNOWN) { if (owner[i] == player) num_neighbors_required[i] = 1; else num_neighbors_required[i] = in_deg[i]; } } while (!q.empty()) { int cur = q.front(); q.pop(); for (int nxt : G[cur]) { if (states[nxt] != UNKNOWN) continue; num_neighbors_required[nxt]--; if (num_neighbors_required[nxt] == 0) { q.push(nxt); states[nxt] = player == Arezou ? POSSIBLY_WINNING : LOSING; } } } } std::vector<int> who_wins(std::vector<int> a, std::vector<int> r, std::vector<int> u, std::vector<int> v) { owner = a; N = a.size(); M = u.size(); assert( (int) v.size() == M ); // Build transpose graph G (that is, reverse each edge) G = VVI(N); in_deg = VI(N); for (int j = 0; j < M; ++j) { G[ v[j] ].push_back( u[j] ); in_deg[ u[j] ]++; } vector<int> states(N, UNKNOWN); for (int ronda = 1; ronda <= 10000; ronda++) { VI sources; for (int i = 0; i < N; i++) if (r[i] == 1 and states[i] != LOSING) { sources.push_back(i); states[i] = POSSIBLY_WINNING; } bfs(Arezou, sources, states); /* cerr << "Round #" << ronda << endl; for (int i = 0; i < N; i++) cerr << states[i] << ' '; cerr << endl; */ if (count(states.begin(), states.end(), UNKNOWN) == 0) break; sources.clear(); for (int i = 0; i < N; i++) { switch (states[i]) { case UNKNOWN: states[i] = LOSING; case LOSING: sources.push_back(i); break; case POSSIBLY_WINNING: states[i] = UNKNOWN; break; } } bfs(Borzou, sources, states); /* for (int i = 0; i < N; i++) cerr << states[i] << ' '; cerr << endl; */ if (count(states.begin(), states.end(), UNKNOWN) == 0) break; } VI res(N); for (int i = 0; i < N; i++) { assert( states[i] != UNKNOWN ); if (states[i] == LOSING) res[i] = 0; else res[i] = 1; } return res; }
#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...