제출 #1349878

#제출 시각아이디문제언어결과실행 시간메모리
1349878bestzuMecho (IOI09_mecho)C++20
12 / 100
88 ms6396 KiB
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
using pii = pair<int,int>;

const int N = 810;
const int inf = 7000;
char a[N][N];
int n, s;
int di[] = {-1, 0, 0, 1};
int dj[] = {0, -1, 1, 0};
int si, sj, ti, tj;
int distBee[N][N];
int distMecho[N][N];

bool ok(int t) {
    if(t >= distBee[si][sj]) return false;

    for(int i = 0; i < n; i++) {
        for(int j = 0; j < n; j++) {
            distMecho[i][j] = inf;
        }
    }
    distMecho[si][sj] = 0;
    queue<pii> q;
    q.push({si, sj});
    while(!q.empty()) {
        int ui = q.front().first, uj = q.front().second;
        q.pop();

        if(ui == ti && uj == tj) return true;

        for(int k = 0; k < 4; k++) {
            int vi = ui + di[k], vj = uj + dj[k];
            if(vi >= 0 && vi < n && vj >= 0 && vj < n) {
                if(a[vi][vj] == 'G' || a[vi][vj] == 'D') {
                    if(distMecho[vi][vj] > distMecho[ui][uj] + 1) {
                        distMecho[vi][vj] = distMecho[ui][uj] + 1;
                        if(distMecho[vi][vj] >= distBee[vi][vj] * s) continue;
                        q.push({vi, vj});
                    }
                }
            }
        }
    }
    return false;
}

int main() {
    ios::sync_with_stdio(false); cin.tie(0);

    cin >> n >> s;
    queue<pii> qb;

    for(int i = 0; i < n; i++) {
        for(int j = 0; j < n; j++) {
            distBee[i][j] = inf;
            cin >> a[i][j];
            if(a[i][j] == 'H') {
                qb.push({i, j});
                distBee[i][j] = 0;
            }
            else if(a[i][j] == 'M') si = i, sj = j;
            else if(a[i][j] == 'D') ti = i, tj = j;
        }
    }

    while(!qb.empty()) {
        int ui = qb.front().first, uj = qb.front().second;
        qb.pop();

        for(int k = 0; k < 4; k++) {
            int vi = ui + di[k], vj = uj + dj[k];
            if(vi >= 0 && vi < n && vj >= 0 && vj < n) {
                if((a[vi][vj] == 'G' || a[vi][vj] == 'M') && distBee[vi][vj] > distBee[ui][uj] + 1) {
                    distBee[vi][vj] = distBee[ui][uj] + 1;
                    qb.push({vi, vj});
                }
            }
        }
    }

    int ans = -1;
    int l = 0, r = 640010;
    while(l <= r) {
        int mid = l + (r-l)/2;
        if(ok(mid)) {
            ans = mid;
            l = mid + 1;
        }
        else {
            r = mid - 1;
        }
    }
    cout << ans;

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...