제출 #331722

#제출 시각아이디문제언어결과실행 시간메모리
331722rqi경찰관과 강도 (BOI14_coprobber)C++14
100 / 100
896 ms9708 KiB
#include "coprobber.h" #include <bits/stdc++.h> using namespace std; typedef pair<int, int> pi; #define mp make_pair #define f first #define s second #define sz(x) (int)(x).size() const int mx = 505; int N; pair<bool, int> dp[mx][mx][2]; int curdeg[mx][mx]; queue<pair<pi, bool>> q; int curpos = 0; int start(int _N, bool A[MAX_N][MAX_N]) { N = _N; for(int i = 0; i < N; i++){ A[i][i] = 1; dp[i][i][0] = dp[i][i][1] = mp(1, -1); q.push(mp(mp(i, i), 0)); q.push(mp(mp(i, i), 1)); } for(int i = 0; i < N; i++){ int deg = 0; for(int j = 0; j < N; j++){ if(j == i) continue; if(A[j][i]){ deg++; } } for(int j = 0; j < N; j++){ curdeg[j][i] = deg; } } while(sz(q)){ pair<pi, bool> qf = q.front(); q.pop(); int a = qf.f.f; int b = qf.f.s; int turn = qf.s; if(turn == 0){ //police's turn is a win for(int i = 0; i < N; i++){ if(i == b) continue; if(A[i][b] && !dp[a][i][1].f){ curdeg[a][i]--; if(curdeg[a][i] == 0){ dp[a][i][1] = mp(1, b); q.push(mp(mp(a, i), 1)); } } } } else{ //robber's turn is a win for(int i = 0; i < N; i++){ if(A[i][a] && !dp[i][b][0].f){ dp[i][b][0] = mp(1, a); q.push(mp(mp(i, b), 0)); } } } } // for(int i = 0; i < N; i++){ // for(int j = 0; j < N; j++){ // for(int k = 0; k < 2; k++){ // cout << i << " " << j << " " << k << " " << dp[i][j][k].f << " " << dp[i][j][k].s << "\n"; // } // } // } // cout << "\n\n"; for(int i = 0; i < N; i++){ bool works = 1; for(int j = 0; j < N; j++){ if(!dp[i][j][0].f) works = 0; } if(works){ curpos = i; return i; } } return -1; } int nextMove(int R) { curpos = dp[curpos][R][0].s; return curpos; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...