Submission #629683

#TimeUsernameProblemLanguageResultExecution timeMemory
62968354skyxenonMecho (IOI09_mecho)C++17
89 / 100
454 ms11668 KiB
// https://oj.uz/problem/view/IOI09_mecho // From https://usaco.guide/problems/ioi-2009mecho/solution #include <bits/stdc++.h> using namespace std; #define pii pair<int, int> #define MAX_N 800 #define int long long vector<string> field(MAX_N); int n, s; int mechox, mechoy, home_x, home_y; vector<vector<bool>> bees_visited(MAX_N, vector<bool>(MAX_N)); vector<vector<int>> bees_time(MAX_N, vector<int>(MAX_N)); int dx[] = {-1, 0, 1, 0}; int dy[] = {0, -1, 0, 1}; bool valid_sq(int x, int y) { return x >= 0 && x < n && y >= 0 && y < n && (field[x][y] == 'G' || field[x][y] == 'M'); } bool mecho_reached(int mecho_dis, int bees_dis){ return mecho_dis / s < bees_dis; } bool ok(int eating_time) { vector<vector<bool>> mecho_visited(n, vector<bool>(n)); vector<vector<int>> mecho_time(n, vector<int>(n)); queue<pii> q({{mechox, mechoy}}); // move Mecho q.push({mechox, mechoy}); mecho_visited[mechox][mechoy] = true; if (bees_time[mechox][mechoy] <= eating_time) { q.pop(); } while (!q.empty()) { int x = q.front().first, y = q.front().second; q.pop(); for (int i = 0; i < 4; i++) { int nx = x + dx[i], ny = y + dy[i]; /* * check if mecho reaces node[x][y] before the bees * divide the time mecho takes to reach a node by s, since * mecho walks s steps at a time. * substract the eating time from the time taken for the * bees to reach the node, because that time was used by * mecho for eating */ if (valid_sq(nx, ny) && !mecho_visited[nx][ny] && mecho_reached(mecho_time[x][y] + 1, bees_time[nx][ny] - eating_time)) { mecho_visited[nx][ny] = true; q.push({nx, ny}); mecho_time[nx][ny] = mecho_time[x][y] + 1; } } } // check if mecho reached a node surrounding his cave before the bees for (int i = 0; i < 4; i++) { int nx = home_x + dx[i], ny = home_y + dy[i]; if (valid_sq(nx, ny) && mecho_reached(mecho_time[nx][ny], bees_time[nx][ny] - eating_time) && mecho_visited[nx][ny]) { return true; } } return false; } int bs(int lo, int hi) { if (lo > hi) { return -1; } int mid = (lo + hi) / 2; if (!ok(mid)) { return bs(lo, mid - 1); } else if (mid < hi && ok(mid + 1)) { return bs(mid + 1, hi); } else { return mid; } } int32_t main() { cin >> n >> s; for (int i = 0; i < n; i++) { cin >> field[i]; } vector<pii> hives; // find x and y coordinates for for Mecho, the bees and the cave for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (field[i][j] == 'M') { mechox = i; mechoy = j; } else if (field[i][j] == 'H') { hives.push_back({i, j}); } else if (field[i][j] == 'D') { home_x = i; home_y = j; } } } // move bees queue<pii> q; for (auto& [x, y] : hives) { q.push({x, y}); bees_visited[x][y] = true; } while (!q.empty()) { int x = q.front().first, y = q.front().second; q.pop(); for (int i = 0; i < 4; i++) { int nx = x + dx[i], ny = y + dy[i]; if (valid_sq(nx, ny) && !bees_visited[nx][ny]) { bees_time[nx][ny] = bees_time[x][y] + 1; q.push({nx, ny}); bees_visited[nx][ny] = true; } } } cout << bs(0, n * n) << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...