제출 #713357

#제출 시각아이디문제언어결과실행 시간메모리
713357Stickfish경찰관과 강도 (BOI14_coprobber)C++17
60 / 100
1582 ms5780 KiB
#include "coprobber.h" #include <iostream> #include <cassert> #include <bitset> #include <vector> using namespace std; bitset<MAX_N> edg[MAX_N]; bitset<MAX_N> redg[MAX_N]; int bad_edg_cnt[2][MAX_N][MAX_N]; int depth[2][MAX_N][MAX_N]; int n; int C; int pR = -1; int start(int N, bool A[MAX_N][MAX_N]) { n = N; int deg[MAX_N]; for (int i = 0; i < N; ++i) for (int j = 0; j < N; ++j) { edg[i][j] = redg[j][i] = A[i][j]; } for (int i = 0; i < N; ++i) deg[i] = edg[i].count(); for (int i = 0; i < N; ++i) for (int j = 0; j < N; ++j) { bad_edg_cnt[0][i][j] = 1; bad_edg_cnt[1][i][j] = deg[j]; depth[1][i][j] = depth[0][i][j] = 1234567890; } vector<vector<int>> q; for (int i = 0; i < N; ++i) { bad_edg_cnt[0][i][i] = bad_edg_cnt[1][i][i] = 0; q.push_back({0, i, i}); q.push_back({1, i, i}); } int timer = 0; while (q.size()) { int t = q.back()[0]; int u = q.back()[1]; int v = q.back()[2]; depth[t][u][v] = timer++; q.pop_back(); bitset<MAX_N> cedg; if (t == 0) cedg = redg[v]; else { cedg = redg[u]; cedg[u] = 1; } for (int i = cedg._Find_first(); i < n; i = cedg._Find_next(i)) { int nu = u; int nv = v; if (t == 0) nv = i; else nu = i; if (nu == nv) continue; if (--bad_edg_cnt[t ^ 1][nu][nv] == 0) { q.push_back({t ^ 1, nu, nv}); } } } for (int u = 0; u < n; ++u) edg[u][u] = 1; for (int u = 0; u < n; ++u) { bool isok = true; for (int v = 0; v < n; ++v) { isok &= bad_edg_cnt[0][u][v] <= 0; } if (isok) return C = u; } return -1; } int nextMove(int R) { pR = R; for (int nC = edg[C]._Find_first(); nC < n; nC = edg[C]._Find_next(nC)) { if (bad_edg_cnt[1][nC][R] <= 0 && depth[1][nC][R] < depth[0][C][R]) { return C = nC; } } assert(0); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...