# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
250170 | Kevin_Zhang_TW | Cop and Robber (BOI14_coprobber) | C++17 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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];
bool con[MAX_N][MAX_N], win[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;
}
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]) {
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) 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;
}