# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
876669 | MisterReaper | Mecho (IOI09_mecho) | C++17 | 125 ms | 7780 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.
#pragma optimize("unroll-loops,O3")
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
const int MAXN = 800 + 5;
char matrix[MAXN][MAXN];
int distBee[MAXN][MAXN];
int distBear[MAXN][MAXN];
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};
#define ONLINE_JUDGE
void solve() {
memset(distBee, -1, sizeof(distBee));
int n, s;
cin >> n >> s;
pair <int, int> initial;
pair <int, int> home;
queue <array <int, 3>> q;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
cin >> matrix[i][j];
if(matrix[i][j] == 'H') {
q.push({0, i, j});
} else if(matrix[i][j] == 'M') {
initial = {i, j};
} else if(matrix[i][j] == 'D') {
home = {i, j};
}
}
}
auto in = [&](int x, int y) -> bool {
return 1 <= min(x, y) && max(x, y) <= n;
};
while(!q.empty()) {
auto [d, x, y] = q.front();
q.pop();
if(distBee[x][y] != -1) {
continue;
}
distBee[x][y] = d;
for(int dir = 0; dir < 4; dir++) {
int _x = x + dx[dir], _y = y + dy[dir];
if(in(_x, _y) && matrix[_x][_y] == 'G') {
q.push({d +1, _x, _y});
}
}
}
auto check = [&](int k) -> bool {
memset(distBear, -1, sizeof(distBear));
q.push({s * k, initial.first, initial.second});
while(!q.empty()) {
auto [d, x, y] = q.front();
q.pop();
if(distBear[x][y] != -1 || (distBee[x][y] != -1 && d / s >= distBee[x][y])) {
continue;
}
//cerr << d << " :: " << x << " " << y << " | " << distBee[x][y] << "\n";
distBear[x][y] = d;
for(int dir = 0; dir < 4; dir++) {
int _x = x + dx[dir], _y = y + dy[dir];
if(in(_x, _y) && (matrix[_x][_y] == 'G' || matrix[_x][_y] == 'D') && distBear[_x][_y] == -1) {
q.push({d +1, _x, _y});
}
}
}
if(distBear[home.first][home.second] == -1) {
return false;
}
return true;
};
int l = 0, r = n * n + 2, ans = 0;
while(l <= r) {
int mid = (l + r) / 2;
if(check(mid -1)) {
ans = mid;
l = mid +1;
} else {
r = mid -1;
}
}
cout << ans -1;
return;
}
signed main() {
#ifndef ONLINE_JUDGE
freopen(".in", "r", stdin);
freopen(".out", "w", stdout);
#endif
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
int t = 1; //cin >> t;
for(int i = 1; i <= t; i++) {
solve();
}
return 0;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |