Submission #1204029

#TimeUsernameProblemLanguageResultExecution timeMemory
120402912345678Cop and Robber (BOI14_coprobber)C++17
100 / 100
350 ms9736 KiB
#include "coprobber.h" #include <bits/stdc++.h> using namespace std; const int nx=505; enum Turn {COP, ROBBER}; int n, dp[nx][nx][2], deg[nx][nx], tmp[nx], cur, a[nx][nx], pa[nx][nx]; queue<tuple<int, int, Turn>> q; int start(int N, bool A[MAX_N][MAX_N]) { n=N; for (int i=0; i<N; i++) for (int j=0;j <N; j++) a[i][j]=A[i][j]; for (int i=0; i<N; i++) for (int j=0; j<N; j++) if (A[i][j]) tmp[i]++; for (int i=0; i<N; i++) for (int j=0; j<N;j ++) deg[i][j]=tmp[j]; for (int i=0; i<N; i++) q.push({i, i, Turn::ROBBER}), dp[i][i][Turn::ROBBER]=1; while (!q.empty()) { auto [cop, robber, turn]=q.front(); q.pop(); if (turn==COP) { for (int i=0; i<N; i++) { if (A[robber][i]) deg[cop][i]--; if (deg[cop][i]==0&&!dp[cop][i][Turn::ROBBER]) { dp[cop][i][Turn::ROBBER]=1; q.push({cop, i, Turn::ROBBER}); } } } else { for (int i=0; i<N; i++) { if ((A[cop][i]||cop==i)&&!dp[i][robber][Turn::COP]) { dp[i][robber][Turn::COP]=1; pa[i][robber]=cop; q.push({i, robber, Turn::COP}); } } } } for (int i=0; i<N; i++) { int f=1; for (int j=0; j<N; j++) if (!dp[i][j][Turn::COP]) f=0; if (f) return cur=i; } return -1; } int nextMove(int R) { return cur=pa[cur][R]; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...