제출 #155432

#제출 시각아이디문제언어결과실행 시간메모리
155432oolimry경찰관과 강도 (BOI14_coprobber)C++14
0 / 100
28 ms23936 KiB
#include "coprobber.h"
#include <bits/stdc++.h>
using namespace std;
static int states[500005]; //police * 1000 + robber * 2 + (IF POLICE TURN)
static int degree[500005];
static vector<int> adj[500005];
static vector<int> rev[500005];
queue<int> can;
inline int g(int police, int robber, int turn){
	return police * 1000 + robber * 2 + turn;
}
int start(int N, bool A[MAX_N][MAX_N])
{
	int n = N;
    for(int u = 0;u < n;u++){
		for(int v = 0;v < n;v++){
			int s = g(u,v,0);
			adj[s].push_back(g(u,v,1)); //Wait
			for(int i = 0;i < n;i++){
				if(A[u][i] == 1) adj[s].push_back(g(i,v,1));
			}
			
			s = g(u,v,1);
			for(int i = 0;i < n;i++){
				if(A[v][i] == 1) adj[s].push_back(g(u,i,0));
			}
		}
	}
	for(int i = 0;i < 500005;i++){
		int u = i / 1000;
		int v = (i / 2) % 500;
		for(int j = 0;j < adj[i].size();j++){
			int q = adj[i][j];
			rev[q].push_back(i);
			degree[i]++;
			if(u == v){
				states[i] = 1;
			}
			//cout << i << " " << q << "\n";
		}
	}
	for(int i = 0;i < 500005;i++){
		if(states[i] == 1){
			can.push(i);
			degree[i] = 0;
		}
	}
	
	while(!can.empty()){
		int t = can.front();
		//cout << t << "\n";
		can.pop();
		for(int i = 0;i < rev[t].size();i++){
			int s = rev[t][i];
			if(states[s] == 0){
				degree[s]--;
				//cout << t << " " << s << " " << degree[s] << "\n";
				if(s % 2 == 0){
					can.push(s);
					states[s] = 1;
					degree[s] = 0;
				}
				else if(degree[s] == 0){
					can.push(s);
					states[s] = 1;
				}
				
			}
		}
	}
	for(int u = 0;u < n;u++){
		bool can = true;
		for(int v = 0;v < n;v++){
			if(states[g(u,v,0)] == 0){
				can = false;
				break;
			}
		}
		if(can) return u;
	}
	return -1;
}

int nextMove(int R)
{
    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

coprobber.cpp: In function 'int start(int, bool (*)[500])':
coprobber.cpp:32:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int j = 0;j < adj[i].size();j++){
                 ~~^~~~~~~~~~~~~~~
coprobber.cpp:53:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 0;i < rev[t].size();i++){
                 ~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...