Submission #107633

# Submission time Handle Problem Language Result Execution time Memory
107633 2019-04-25T11:05:48 Z dfistric Cop and Robber (BOI14_coprobber) C++14
30 / 100
45 ms 1912 KB
#include "coprobber.h"
#include <bits/stdc++.h>

#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define FORd(i, a, b) for (int i = (a); i >= (b); i--)
#define REP(i, n) FOR(i, 0, n)
#define ll long long

using namespace std;

int strategy;
int n;
vector <int> ve[MAX_N];
int D[MAX_N], F[MAX_N];
int disc = -1;
int P, W, H;

const int MAXN = 110;
int dp[MAXN][MAXN];
int mv[MAXN][MAXN];

int rek(int x, int y) {
    if (x == y) return 1;
    if (dp[x][y] != -1) return dp[x][y];

    dp[x][y] = 0;

    int ma = 1;
    for (int b : ve[y]) {
        ma = min(ma, rek(x, b));
    }
    if (ma == 1) {
        mv[x][y] = x;
        dp[x][y] = 1;
        return 1;
    }

    for (int a : ve[x]) {
        int ma = 1;
        for (int b : ve[y]) {
            ma = min(ma, rek(a, b));
        }
        if (ma == 1) {
            mv[x][y] = a;
            dp[x][y] = 1;
            return 1;
        }
    }

    return 0;
}

void dfs(int x, int p) {
    D[x] = ++disc;

    for (int y : ve[x]) {
        if (y == p) continue;
        dfs(y, x);
    }

    F[x] = disc;
    return; 
}

int start(int N, bool A[MAX_N][MAX_N]) {
    n = N;
    int e = 0;

    REP(i, n) {
        REP(j, n) {
            if (A[i][j]) ve[i].push_back(j), e++;
        }
    }
    e /= 2;

    if (e == n - 1) {
        dfs(0, 0);
        strategy = 0, P = 0;
        return 0;
    }

    W = 1, H = 1;
    while (A[W - 1][W] == 1) W++;
    H = n / W;

    if (e == ((W - 1) * H + (H - 1) * W)) {
        strategy = 1, P = 0;
        return P;
    } 

    strategy = 2;
    memset(dp, -1, sizeof dp);
    REP(i, n) {
        int sol = 1;
        REP(j, n) {
            sol = min(sol, rek(i, j));
        }
        if (sol == 1) {
            P = i;
            return P;
        }
    }

    return -1;
}

int nextMove(int R) {

    if (strategy == 0) {
        for (int x : ve[P]) {
            if (D[x] < D[P]) continue;
        
            if (D[x] <= D[R] && F[R] <= F[x]) {
                P = x;
                return P;
            }
        }
        assert(0);
    } else if (strategy == 1) {
        if (abs((R % W) - (P % W)) == 1 && abs((R / W) - (P / W)) == 1) return P;


        if (R % W == P % W) {
            if (R > P) P += W;
            else       P -= W;

            return P;
        } else if (abs((R % W) - (P % W)) == 1) {
            if (R / W == P / W) {
                if (R > P) P++;
                else       P--;

                return P;
            } else {
                if (R > P) P += W;
                else       P -= W;

                return P;
            }
        } else {
            if (R % W > P % W) P++;
            else               P--;

            return P;
        }
    } else {
        P = mv[P][R];
        return P;
    }

    return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 2 ms 384 KB Output is correct
3 Correct 2 ms 384 KB Output is correct
4 Correct 42 ms 1784 KB Output is correct
5 Correct 12 ms 896 KB Output is correct
6 Correct 45 ms 1656 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 2 ms 384 KB Output is correct
3 Correct 40 ms 1656 KB Output is correct
4 Correct 42 ms 1788 KB Output is correct
5 Correct 39 ms 1656 KB Output is correct
6 Correct 41 ms 1628 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 2 ms 384 KB Output is correct
3 Correct 2 ms 384 KB Output is correct
4 Correct 2 ms 384 KB Output is correct
5 Correct 2 ms 384 KB Output is correct
6 Incorrect 2 ms 384 KB Cop can catch the robber, but start() returned -1
7 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 2 ms 384 KB Output is correct
3 Correct 2 ms 384 KB Output is correct
4 Correct 43 ms 1876 KB Output is correct
5 Correct 12 ms 1024 KB Output is correct
6 Correct 45 ms 1784 KB Output is correct
7 Correct 2 ms 384 KB Output is correct
8 Correct 2 ms 384 KB Output is correct
9 Correct 41 ms 1784 KB Output is correct
10 Correct 41 ms 1912 KB Output is correct
11 Correct 39 ms 1656 KB Output is correct
12 Correct 42 ms 1656 KB Output is correct
13 Incorrect 2 ms 384 KB Cop can catch the robber, but start() returned -1
14 Halted 0 ms 0 KB -