Submission #250177

#TimeUsernameProblemLanguageResultExecution timeMemory
250177Kevin_Zhang_TWCop and Robber (BOI14_coprobber)C++17
0 / 100
1 ms384 KiB
#include "coprobber.h"
#include <bits/stdc++.h>

using namespace std;
#define pb emplace_back
#define MAX_N 500
#define tm asdfasdfoi
const int inf = 1e9;
// modify the following functions
// you can define global variables and functions
int now, n;
vector<int> edge[MAX_N];
int F[MAX_N][MAX_N];
bool con[MAX_N][MAX_N], win[MAX_N][MAX_N], lose[MAX_N][MAX_N];
int tm[MAX_N][MAX_N];
int lst, CT;
bool check(int a, int b) {
	if (a == b) return true;
	for (int u : edge[b]) {
		if (!con[a][u]) return false;
	}
	++CT;
	return true;
}
random_device rd;
uniform_int_distribution<int> di(0, 1);
int ra() {
	return di(rd);
}
	
int start(int N, bool A[MAX_N][MAX_N]) {
	n = N;
	for (int i = 0;i < n;++i) {
		for (int j = 0;j < n;++j)  if (A[i][j])
				con[i][j] = true, edge[i].pb(j);
		con[i][i] = true;
	}
	for (int i = 0;i < n;++i)
		for (int j = 0;j < n;++j) {
			win[i][j] = check(i, j);
			if (win[i][j]) tm[i][j] = ++CT;
		}

	bool ch = true;
	while (ch) {
		ch = false;
		for (int i = 0;i < n;++i)
			for (int j = 0;j < n;++j) if (!win[i][j]) {
				if (ra) continue;
				bool esc = false;
				for (int &l = F[i][j];l < edge[j].size();++l) {
					int u = edge[j][l];
					bool die = false;
					for (int k : edge[i]) {
						if (win[k][u]) {
							die = true;
							break;
						}
					}
					die |= win[i][u];
					if (!die) esc = true;
					if (esc) break;
				}
				//if (esc) lose[i][j] = true;
				if (!esc) win[i][j] = true, ch = true, tm[i][j] = ++CT;
			}
	}
	for (int i = 0;i < n;++i) {
		bool allwin = true;
		for (int j = 0;j < n;++j)
			if (!win[i][j]) {
				allwin = false;
				break;
			}
		if (allwin) {
			//assert(i == 0);
			return now = i;
		}
	}
	return -1;
}
int nextMove(int R) {
	if (now == R || con[now][R]) return R;
	for (int u : edge[now]) 
		if (win[u][R] && tm[u][R] < lst)
			return lst = tm[u][R], now = u;
	lst = tm[now][R];
	return now;
}

Compilation message (stderr)

coprobber.cpp: In function 'int start(int, bool (*)[500])':
coprobber.cpp:49:11: warning: the address of 'int ra()' will never be NULL [-Waddress]
     if (ra) continue;
           ^
coprobber.cpp:51:29: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int &l = F[i][j];l < edge[j].size();++l) {
                           ~~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...