Submission #1231596

#TimeUsernameProblemLanguageResultExecution timeMemory
1231596kaiboyCop and Robber (BOI14_coprobber)C++20
100 / 100
286 ms9720 KiB
#include "coprobber.h"
#include <algorithm>
#include <iostream>

const int N = 500;

int pp[N][N], kk[N][N], qu[N * N * 2][3], i;

int start(int n, bool aa[][N]) {
	int cnt = 0;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++)
			pp[i][j] = -1;
		pp[qu[cnt][0] = i][qu[cnt][1] = i] = i, qu[cnt][2] = 0, cnt++;
	}
	for (int j = 0; j < n; j++) {
		int k = 0;
		for (int j_ = 0; j_ < n; j_++)
			if (aa[j][j_])
				k++;
		for (int i = 0; i < n; i++)
			kk[i][j] = k;
		kk[j][j] = 0, qu[cnt][0] = qu[cnt][1] = j, qu[cnt][2] = 1, cnt++;
	}
	for (int h = 0; h < cnt; h++) {
		int i = qu[h][0], j = qu[h][1], t = qu[h][2];
		if (!t) {
			for (int j_ = 0; j_ < n; j_++)
				if (aa[j_][j] && !--kk[i][j_])
					qu[cnt][0] = i, qu[cnt][1] = j_, qu[cnt][2] = 1, cnt++;
		} else {
			for (int i_ = 0; i_ < n; i_++)
				if ((i_ == i || aa[i_][i]) && pp[i_][j] == -1)
					pp[qu[cnt][0] = i_][qu[cnt][1] = j] = i, qu[cnt][2] = 0, cnt++;
		}
	}
	for (i = 0; i < n; i++) {
		bool yes = true;
		for (int j = 0; j < n; j++)
			if (pp[i][j] == -1) {
				yes = false;
				break;
			}
		if (yes)
			break;
	}
	return i < n ? i : -1;
}

int nextMove(int j) {
	return i = pp[i][j];
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...