# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
950874 | blackslex | Mecho (IOI09_mecho) | C++17 | 141 ms | 6720 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
using namespace std;
using pii = pair<int, int>;
using tp = tuple<int, int, int>;
const int cd[4][2] = {{0, 1}, {0, -1}, {-1, 0}, {1, 0}};
int n, s, sx, sy, tx, ty;
int main() {
scanf("%d %d", &n, &s);
vector<string> c(n + 5);
for (int i = 1; i <= n; i++) cin >> c[i], c[i] = " " + c[i];
queue<pii> q;
vector<vector<int>> d(n + 5, vector<int>(n + 5, 1e9));
vector<vector<bool>> f(n + 5, vector<bool>(n + 5));
for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) if (c[i][j] == 'M') sx = i, sy = j; else if (c[i][j] == 'H') d[i][j] = 1, q.emplace(i, j); else if (c[i][j] == 'D') tx = i, ty = j;
while (!q.empty()) {
auto [x, y] = q.front(); q.pop();
if (f[x][y]) continue; f[x][y] = 1;
for (int i = 0; i < 4; i++) {
int nx = x + cd[i][0], ny = y + cd[i][1];
if (nx <= 0 || nx > n || ny <= 0 || ny > n || c[nx][ny] == 'T' || c[nx][ny] == 'D') continue;
if (d[nx][ny] > d[x][y] + 1) d[nx][ny] = d[x][y] + 1, q.emplace(nx, ny);
}
}
auto bs = [&] (int val) {
vector<vector<int>> d2(n + 5, vector<int>(n + 5, 1e9));
vector<vector<bool>> f2(n + 5, vector<bool>(n + 5));
queue<tp> cq; d2[sx][sy] = val + 1; cq.emplace(sx, sy, 0);
while (!cq.empty()) {
auto [x, y, t] = cq.front(); cq.pop();
if (f2[x][y]) continue; f2[x][y] = 1;
int nt = t + 1, nts = (t + 1) % s;
for (int i = 0; i < 4; i++) {
int nx = x + cd[i][0], ny = y + cd[i][1];
if (nx <= 0 || nx > n || ny <= 0 || ny > n || c[nx][ny] == 'T' || f2[nx][ny]) continue;
if (!nts) d2[nx][ny] = d2[x][y] + 1;
else d2[nx][ny] = d2[x][y];
if (d2[nx][ny] < d[nx][ny]) cq.emplace(nx, ny, nt);
}
}
return d2[tx][ty] != 1e9;
};
int l = 0, r = 1e6;
while (l <= r) {
int mid = (l + r) >> 1;
if (bs(mid)) l = mid + 1;
else r = mid - 1;
}
printf("%d", r);
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |