Submission #745821

#TimeUsernameProblemLanguageResultExecution timeMemory
745821fishy15Mecho (IOI09_mecho)C++17
100 / 100
407 ms6792 KiB
#include <iostream>
#include <iomanip>
#include <fstream>
#include <vector>
#include <array>
#include <algorithm>
#include <utility>
#include <map>
#include <queue>
#include <set>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <functional>
#include <numeric>

#define ll long long
#define ld long double
#define eps 1e-8
#define MOD 1000000007

#define INF 0x3f3f3f3f
#define INFLL 0x3f3f3f3f3f3f3f3f

// change if necessary
#define MAXN 1000000

using namespace std;

constexpr array<int, 4> dx = {0, 1, 0, -1};
constexpr array<int, 4> dy = {1, 0, -1, 0};

int main() {
    cin.tie(0)->sync_with_stdio(0);

    int n, s;
    cin >> n >> s;

    vector<string> grid(n);
    for (int i = 0; i < n; i++) {
        cin >> grid[i];
    }

    vector min_bee(n, vector<int>(n, INF));

    auto valid = [&](int x, int y, string ok) {
        if (x >= 0 && y >= 0 && x < n && y < n) {
            return count(ok.begin(), ok.end(), grid[x][y]) > 0;
        }
        return false; 
    };

    queue<array<int, 2>> q;
    array<int, 2> start, end;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (grid[i][j] == 'H') {
                min_bee[i][j] = 0;
                q.push({i, j});
            } else if (grid[i][j] == 'M') {
                start = {i, j};
            } else if (grid[i][j] == 'D') {
                end = {i, j};
            }
        }
    }

    while (!q.empty()) {
        auto [x, y] = q.front();
        q.pop();

        for (int d = 0; d < 4; d++) {
            int nx = x + dx[d];
            int ny = y + dy[d];
            if (valid(nx, ny, "GM") && min_bee[nx][ny] == INF) {
                min_bee[nx][ny] = min_bee[x][y] + 1;
                q.push({nx, ny});
            }
        }
    }

    vector min_reach(n, vector<int>(n));
    auto check = [&](int wait) {
        queue<array<int, 2>> q;
        
        if (wait >= min_bee[start[0]][start[1]]) {
            return false;
        }

        for (auto &v : min_reach) {
            fill(v.begin(), v.end(), INF);
        }

        min_reach[start[0]][start[1]] = wait * s;
        q.push(start);

        while (!q.empty()) {
            auto [x, y] = q.front();
            q.pop();

            for (int d = 0; d < 4; d++) {
                int nx = x + dx[d];
                int ny = y + dy[d];
                int nt = min_reach[x][y] + 1;
                if (valid(nx, ny, "GHD") && min_reach[nx][ny] == INF && nt / s < min_bee[nx][ny]) {
                    min_reach[nx][ny] = nt;
                    q.push({nx, ny});
                }
            }
        }

        return min_reach[end[0]][end[1]] < INF;
    };

    int ans = -1;
    int l = 0;
    int r = n * n;

    while (l <= r) {
        int m = (l + r) / 2;
        if (check(m)) {
            ans = m;
            l = m + 1;
        } else {
            r = m - 1;
        }
    }

    cout << ans << '\n';

    return 0;
}

Compilation message (stderr)

mecho.cpp: In function 'int main()':
mecho.cpp:112:40: warning: 'end.std::array<int, 2>::_M_elems[1]' may be used uninitialized in this function [-Wmaybe-uninitialized]
  112 |         return min_reach[end[0]][end[1]] < INF;
      |                                        ^
mecho.cpp:112:32: warning: 'end.std::array<int, 2>::_M_elems[0]' may be used uninitialized in this function [-Wmaybe-uninitialized]
  112 |         return min_reach[end[0]][end[1]] < INF;
      |                                ^
#Verdict Execution timeMemoryGrader output
Fetching results...