Submission #1300073

#TimeUsernameProblemLanguageResultExecution timeMemory
1300073Dinh_Van_TungMecho (IOI09_mecho)C++20
12 / 100
323 ms6452 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define maxn 805 #define mod 1000000007 char a[maxn][maxn]; int n, s, Bee_dist[maxn][maxn], Mecho_dist[maxn][maxn]; int dx[] = {-1, 1, 0, 0}, dy[] = {0, 0, -1, 1}; vector<pair<int, int>> pos_hive; pair<int, int> pos_home, pos_Mecho; queue<pair<int, int>> Bee_q, Mecho_q; bool Bee_inside(int x, int y) { return (1 <= x && x <= n && 1 <= y && y <= n && a[x][y] != 'T' && a[x][y] != 'D'); } bool Mecho_inside(int x, int y) { return (1 <= x && x <= n && 1 <= y && y <= n && a[x][y] != 'T' && a[x][y] != 'H'); } bool f(int time) { memset(Bee_dist, 0x3f, sizeof Bee_dist); memset(Mecho_dist, 0x3f, sizeof Mecho_dist); for (auto [x, y] : pos_hive) { Bee_q.push({x, y}); Bee_dist[x][y] = 0; } while (Bee_q.size()) { auto [x, y] = Bee_q.front(); Bee_q.pop(); for (int dir = 0; dir < 4; dir += 1) { int newx = x + dx[dir], newy = y + dy[dir]; if (Bee_inside(newx, newy) && Bee_dist[newx][newy] > Bee_dist[x][y] + 1) { Bee_dist[newx][newy] = Bee_dist[x][y] + 1; Bee_q.push({newx, newy}); } } } Mecho_dist[pos_Mecho.first][pos_Mecho.second] = 0; Mecho_q.push({pos_Mecho.first, pos_Mecho.second}); while (Mecho_q.size()) { auto [x, y] = Mecho_q.front(); Mecho_q.pop(); if (Bee_dist[x][y] <= time) { continue; } for (int dir = 0; dir < 4; dir += 1) { int newx = x + dx[dir], newy = y + dy[dir]; if (Mecho_inside(newx, newy) && Mecho_dist[newx][newy] > Mecho_dist[x][y] + 1) { if (Mecho_dist[x][y] + 1 < s * Bee_dist[newx][newy]) { Mecho_dist[newx][newy] = Mecho_dist[x][y] + 1; Mecho_q.push({newx, newy}); } } } } for (int dir = 0; dir < 4; dir += 1) { int x = pos_home.first + dx[dir], y = pos_home.second + dy[dir]; if (Mecho_inside(x, y) && Mecho_dist[x][y] < 1e9) { return true; } } return false; } void solve() { cin >> n >> s; for (int i = 1; i <= n; i += 1) for (int j = 1; j <= n; j += 1) { cin >> a[i][j]; if (a[i][j] == 'H') { pos_hive.push_back({i, j}); } else if (a[i][j] == 'M') { pos_Mecho = {i, j}; } else if (a[i][j] == 'D') { pos_home = {i, j}; } } int l = -1, r = n * n + 1; while (r - l > 1) { int m = (l + r) / 2; if (f(m)) { l = m; } else { r = m; } } cout << l - 1; return; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int test_case = 1; // cin >> test_case; for (int i = 1; i <= test_case; i += 1) { solve(); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...