Submission #155435

#TimeUsernameProblemLanguageResultExecution timeMemory
155435oolimryCop and Robber (BOI14_coprobber)C++14
60 / 100
1556 ms135000 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 int to[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 pos;
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);
			rev[g(u,v,1)].push_back(s); //Wait
			degree[s]++;
			for(int i = 0;i < n;i++){
				if(A[u][i] == 1){
					rev[g(i,v,1)].push_back(s);
					degree[s]++;
				}
			}
			
			s = g(u,v,1);
			for(int i = 0;i < n;i++){
				if(A[v][i] == 1){
					rev[g(u,i,0)].push_back(s);
					degree[s]++;
				}
			}
			if(u == v){
				states[g(u,v,1)] = 1;
				states[g(u,v,0)] = 0;
			}
		}
	}
	
	for(int i = 0;i < 500005;i++){
		if(states[i] == 1){
			can.push(i);
			degree[i] = 0;
		}
	}
	int work[n];
	fill(work,work+n,n);
	while(!can.empty()){
		int t = can.front();
		//cout << t << "\n";
		if(t % 2 == 0){
			work[t/1000]--;
			if(work[t/1000] == 0){
				pos = t/1000;
				return t/1000;
			}
		}
		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;
					to[s] = t;
					//cout << s << " " << t << "\n";
				}
				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){
			pos = u;
			return u;
		}
	}
	*/
	return -1;
}

int nextMove(int R)
{
    int cur = g(pos,R,0);
    int t = to[cur];
    t /= 1000;
    //cout << t << " " << R << "\n";
    pos = t;
    return t;
}

Compilation message (stderr)

coprobber.cpp: In function 'int start(int, bool (*)[500])':
coprobber.cpp:61: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...