Submission #196190

#TimeUsernameProblemLanguageResultExecution timeMemory
196190triMecho (IOI09_mecho)C++14
100 / 100
290 ms7672 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair<int, int> pi;
typedef pair<ll, ll> pl;

typedef vector<int> vi;
typedef vector<ld> vd;
typedef vector<ll> vl;

#define pb push_back
#define f first
#define s second

const int MAXN = 1000;
const int INF = 1e9;

int unuse[MAXN][MAXN];
int reach[MAXN][MAXN];

const int dI[] = {-1, 0, 1, 0};
const int dJ[] = {0, -1, 0, 1};

int N, S;
pi st, goal;

bool reachGoal(int delay) {
    if (delay == -1) return true;
    for (int i = 0; i <= N + 1; i++) {
        for (int j = 0; j <= N + 1; j++) {
            reach[i][j] = INF;
        }
    }

    reach[st.f][st.s] = delay * S;
    queue<pi> q;
    q.push(st);

    while (q.size()) {
        pi cur = q.front();
        q.pop();

        if (reach[cur.f][cur.s] < unuse[cur.f][cur.s] * S) {
            for (int d = 0; d < 4; d++) {
                int nI = cur.f + dI[d];
                int nJ = cur.s + dJ[d];

                if (reach[nI][nJ] == INF) {
                    reach[nI][nJ] = reach[cur.f][cur.s] + 1;
                    q.push({nI, nJ});
                }
            }
        }
    }

    return reach[goal.f][goal.s] != INF;
}

int binSearch() {
    int low = -1;
    int high = 800 * 800;

    while (low != high) {
        int mid = (low + high + 1) / 2;

        if (reachGoal(mid)) {
            low = mid;
        } else {
            high = mid - 1;
        }
    }
    return low;
}

int main() {
    cin >> N >> S;

    for (int i = 0; i <= N + 1; i++) {
        for (int j = 0; j <= N + 1; j++) {
            unuse[i][j] = -1;
        }
    }

    for (int i = 0; i <= N + 1; i++) {
        unuse[0][i] = 0;
        unuse[N + 1][i] = 0;
        unuse[i][0] = 0;
        unuse[i][N + 1] = 0;
    }

    queue<pi> q;
    for (int i = 1; i <= N; i++) {
        string line;
        cin >> line;
        for (int j = 1; j <= N; j++) {
            char cur = line[j - 1];
            if (cur == 'T') {
                unuse[i][j] = 0;
            } else if (cur == 'H') {
                unuse[i][j] = 0;
                q.push({i, j});
            } else if (cur == 'M') {
                st = {i, j};
            } else if (cur == 'D') {
                goal = {i, j};
                unuse[i][j] = INF;
            } else {
                assert(cur == 'G');
            }
        }
    }

    while (!q.empty()) {
        pi cur = q.front();
        q.pop();

        for (int d = 0; d < 4; d++) {
            int nI = cur.f + dI[d];
            int nJ = cur.s + dJ[d];
            if (unuse[nI][nJ] == -1) {
                unuse[nI][nJ] = unuse[cur.f][cur.s] + 1;
                q.push({nI, nJ});
            }
        }
    }
    int ans = binSearch();
    cout << ans << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...