Submission #1293761

#TimeUsernameProblemLanguageResultExecution timeMemory
1293761goppamachMecho (IOI09_mecho)C++20
100 / 100
151 ms6340 KiB
#include <bits/stdc++.h>

using namespace std;

#define el "\n"
#define pii pair<int, int>
#define pll pair<ll, ll>
#define fi first
#define se second
#define FOR(i, l, r) for (int i = (l); i <= (r); i++)
#define FOD(i, l, r) for (int i = (l); i >= (r); i--)
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define sz(x) ((int)(x).size())
#define fast_io ios_base::sync_with_stdio(false); cin.tie(nullptr);

using db = long double;
using ll = long long;
using ull = unsigned long long;
using vi = vector<int>;
using vll = vector<ll>;
using vpii = vector<pii>;
using vpll = vector<pll>;
using vvi = vector<vi>;
using vvll = vector<vll>;
using vbool = vector<bool>;
using vvbool = vector<vbool>;

template<class T> bool chmax(T &a, T const &b) { return (a < b ? (a = b, true) : false); }
template<class T> bool chmin(T &a, T const &b) { return (a > b ? (a = b, true) : false); }

// #define DEBUG
#ifdef DEBUG
#include "D:\cpp\debug.cpp"
#else
#define debug(...)
#define debug_arr(...)
#endif

mt19937 rng((uint32_t)chrono::steady_clock::now().time_since_epoch().count());

constexpr int N = 805;
constexpr int INF = 1E9 + 7;
constexpr ll INFLL = 1E18;
constexpr int MOD = 1E9 + 7; // 998244353
constexpr double EPS = 1E-10;

char grid[N][N];
int bees_time[N][N], mecho_time[N][N];
int sx, sy, tx, ty;
int n, s;

const int directions[4][2] = {{-1, 0}, {+1, 0}, {0, -1}, {0, +1}};

bool valid_cell(int x, int y) {
    return x >= 1 && x <= n && y >= 1 && y <= n && grid[x][y] != 'T';
}

bool can_mecho_reach(int mecho_time, int bees_time) {
    return mecho_time / s < bees_time;
}

bool check(int delay) {
    memset(mecho_time, -1, sizeof mecho_time);
    queue<pii> q;
    q.emplace(sx, sy);
    mecho_time[sx][sy] = 0;
    if (bees_time[sx][sy] <= delay) q.pop();

    while (!q.empty()) {
        auto [x, y] = q.front();
        q.pop();
        if (x == tx && y == ty) return true;
        for (auto &[dx, dy] : directions) {
            int nx = x + dx, ny = y + dy;
            if (!valid_cell(nx, ny)) continue;
            if (mecho_time[nx][ny] == -1 && can_mecho_reach(mecho_time[x][y] + 1, bees_time[nx][ny] - delay)) {
                mecho_time[nx][ny] = mecho_time[x][y] + 1;
                q.emplace(nx, ny);
            }
        }
    }

    return false;
}

void solve() {
    cin >> n >> s;

    memset(bees_time, -1, sizeof bees_time);
    queue<pii> q;
    FOR(i, 1, n) {
        FOR(j, 1, n) {
            cin >> grid[i][j];
            if (grid[i][j] == 'M') {
                sx = i;
                sy = j;
            } else if (grid[i][j] == 'D') {
                tx = i;
                ty = j;
            } else if (grid[i][j] == 'H') {
                q.emplace(i, j);
                bees_time[i][j] = 0;
            }
        }
    }

    bees_time[tx][ty] = INF;
    while (!q.empty()) {
        auto [x, y] = q.front();
        q.pop();
        for (auto const &[dx, dy] : directions) {
            int nx = x + dx, ny = y + dy;
            if (!valid_cell(nx, ny)) continue;
            if (bees_time[nx][ny] == -1) {
                bees_time[nx][ny] = bees_time[x][y] + 1;
                q.emplace(nx, ny);
            }
        }
    }

    int l = 0, r = n * n, res = 0;
    while (l <= r) {
        int m = (l + r) / 2;
        if (check(m)) {
            res = m;
            l = m + 1;
        } else {
            r = m - 1;
        }
    }

    cout << (!check(res) ? -1 : res) << el;
}

int main() {
    fast_io
    #define LOCAL
    #ifndef LOCAL
    #define PROBLEM ""
    freopen(PROBLEM ".INP", "r", stdin);
    freopen(PROBLEM ".OUT", "w", stdout);
    #endif

    int t = 1;
    // cin >> t;
    while (t--) solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...