제출 #15985

#제출 시각아이디문제언어결과실행 시간메모리
15985myungwoo경찰관과 강도 (BOI14_coprobber)C++14
100 / 100
860 ms15244 KiB
#include <bits/stdc++.h> using namespace std; #define MAXK 500005 #define pb push_back #define sz(v) ((int)(v).size()) static int N, K, cop_pos; static int num[501][501][2], deg[MAXK]; static int C[MAXK], R[MAXK], T[MAXK], F[MAXK]; static bool w[501][501], V[MAXK]; inline int get_dp(int c, int r, int t) { int n = num[c][r][t]; if (!V[n]) return 0; if (!t) return C[F[n]]; return 1; } int start(int n, bool A[500][500]) { N = n; for (int i=1;i<=N;i++) for (int j=1;j<=N;j++) w[i][j] = A[i-1][j-1]; for (int i=1;i<=N;i++) for (int j=1;j<=N;j++) for (int k=0;k<2;k++){ num[i][j][k] = ++K; C[K] = i, R[K] = j, T[K] = k; } vector <int> _deg_(N+1, 0); for (int i=1;i<=N;i++) for (int j=1;j<=N;j++) if (w[i][j]) _deg_[i]++; for (int i=1;i<=N;i++) for (int j=1;j<=N;j++) if (i != j){ deg[num[i][j][1]] = _deg_[j]; } queue <int> que; for (int i=1;i<=N;i++){ V[num[i][i][0]] = 1, que.push(num[i][i][0]); V[num[i][i][1]] = 1, que.push(num[i][i][1]); } while (!que.empty()){ int q = que.front(); que.pop(); int c = C[q], r = R[q], t = T[q]; if (t){ for (int i=1;i<=N;i++) if (c == i || w[i][c]){ int m = num[i][r][0]; if (!V[m]) V[m] = 1, F[m] = q, que.push(m); } }else{ for (int i=1;i<=N;i++) if (w[i][r]){ int m = num[c][i][1]; if (!--deg[m]) V[m] = 1, que.push(m); } } } for (int i=1;i<=N;i++){ bool sw = 0; for (int j=1;j<=N;j++) if (!get_dp(i, j, 1)){ sw = 1; break; } if (sw) continue; cop_pos = i; return i-1; } return -1; } int nextMove(int x) { ++x; int to = get_dp(cop_pos, x, 0); cop_pos = to; return to-1; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...