제출 #226880

#제출 시각아이디문제언어결과실행 시간메모리
226880MetB경찰관과 강도 (BOI14_coprobber)C++14
100 / 100
899 ms10896 KiB
#include "coprobber.h"
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
 
using namespace __gnu_pbds;
 
#define N 1000003
 
using namespace std;
 
typedef long long ll;
typedef unsigned long long ull;
 
const ll INF = 1e18, MOD = 1e9 + 7, MOD2 = 1e6 + 3;

int d[500][500][2], dg[500][500][2], m, n;
int mv[500][500][2], gl, sm[500];
bool a[500][500];

bool is_n (int x, int y, int t, int i) {
	if (t) return a[x][i] || (x == i);
	return a[y][i];
}

int start (int v, bool A[][500]) {
	n = v;
	m = 2 * n * n;

	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++)
			sm[i] += (int) A[i][j];
	memcpy (a, A, sizeof (a));

	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++) {
			dg[i][j][0] = sm[i] + 1;
			dg[i][j][1] = sm[j];
			d[i][j][0] = d[i][j][1] = 2;
		}

	queue <tuple <int, int, int>> q;


	for (int i = 0; i < n; i++) {
		d[i][i][0] = 1, d[i][i][1] = 0;
		q.push ({i, i, 0}), q.push ({i, i, 1});
	}

	while (!q.empty ()) {
		auto s = q.front ();
		int x, y, t;
		tie (x, y, t) = s;
		q.pop ();
		for (int i = 0; i < n; i++) {
			if (is_n (x, y, t, i)) {
				int a = x, b = y, c = !t;
				if (t) a = i; else b = i;
				if (d[a][b][c] != 2) continue;
				if (!d[x][y][t]) {
					d[a][b][c] = 1, mv[a][b][c] = x;
					q.push ({a, b, c});
				} else {
					if (--dg[a][b][c] < 1) {
						d[a][b][c] = 0;
						q.push ({a, b, c});
					}
				}
			}
		}
	}

	for (int i = 0; i < n; i++) {
		int ok = 1;
		for (int j = 0; j < n; j++) {
			if (d[i][j][0] != 1) {
				ok = 0; break;
			}
		}
		if (ok) return gl = i;
	}
	return -1;
}

int nextMove (int x) {
	return gl = mv[gl][x][0];
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...