Submission #202876

#TimeUsernameProblemLanguageResultExecution timeMemory
202876faremyCop and Robber (BOI14_coprobber)C++14
100 / 100
670 ms5112 KiB
#include "coprobber.h" #include <vector> struct State { State(int c, int r, int p) : posCop(c), posRob(r), player(p) {} int posCop, posRob, player; }; const int MAXN = 500; int nodeDeg[MAXN]; int degree[MAXN][MAXN][2]; std::vector<State> rm; bool copWin[MAXN][MAXN][2]; int go[MAXN][MAXN]; int posCop = -1; void process(int cop, int robber, int player, int from) { if (!copWin[cop][robber][player]) { if (player == 0) go[cop][robber] = from; copWin[cop][robber][player] = true; rm.emplace_back(cop, robber, player); } } int start(int N, bool A[MAX_N][MAX_N]) { for (int iNode = 0; iNode < N; iNode++) for (int jNode = 0; jNode < N; jNode++) nodeDeg[iNode] += A[iNode][jNode]; for (int iCop = 0; iCop < N; iCop++) for (int iRobber = 0; iRobber < N; iRobber++) { go[iCop][iRobber] = -1; degree[iCop][iRobber][0] = nodeDeg[iCop] + 1; degree[iCop][iRobber][1] = nodeDeg[iRobber]; } for (int iNode = 0; iNode < N; iNode++) process(iNode, iNode, 1, -1); while (!rm.empty()) { int cop = rm.back().posCop; int robber = rm.back().posRob; int player = rm.back().player; rm.pop_back(); if (player == 1) process(cop, robber, 0, cop); for (int iEsc = 0; iEsc < N; iEsc++) { if (player == 1 && A[cop][iEsc]) process(iEsc, robber, 0, cop); if (player == 0 && A[robber][iEsc]) { degree[cop][iEsc][1]--; if (degree[cop][iEsc][1] == 0) process(cop, iEsc, 1, -1); } } } for (int iCop = 0; iCop < N; iCop++) { bool isWinner = true; for (int iRobber = 0; iRobber < N; iRobber++) isWinner &= copWin[iCop][iRobber][0]; if (isWinner) { posCop = iCop; return iCop; } } return -1; } int nextMove(int R) { int next = go[posCop][R]; posCop = next; return next; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...