Submission #689517

#TimeUsernameProblemLanguageResultExecution timeMemory
689517tcmmichaelb139Mecho (IOI09_mecho)C++17
13 / 100
94 ms6332 KiB
#include "bits/stdc++.h" using namespace std; const int dx[] = {1, 0, -1, 0}, dy[] = {0, 1, 0, -1}; struct node { int x, y; int mx; int step; int dist; bool operator<(const node& rhs) const { return mx < rhs.mx; } }; int main() { ios::sync_with_stdio(0); cin.tie(0); int n, s; cin >> n >> s; vector<vector<char>> ar(n, vector<char>(n)); pair<int, int> start, end; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) { cin >> ar[i][j]; if (ar[i][j] == 'M') start = {i, j}; else if (ar[i][j] == 'D') end = {i, j}; } auto bee_dist_gen = [&]() { vector<vector<int>> dist(n, vector<int>(n, 1e9)); queue<pair<int, int>> q; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) if (ar[i][j] == 'H') q.push({i, j}), dist[i][j] = 0; while (!q.empty()) { pair<int, int> v = q.front(); q.pop(); for (int i = 0; i < 4; i++) { int nx = v.first + dx[i], ny = v.second + dy[i]; if (nx < 0 || ny < 0 || nx >= n || ny >= n) continue; if (ar[nx][ny] == 'T') continue; if (dist[nx][ny] <= dist[v.first][v.second] + 1) continue; dist[nx][ny] = dist[v.first][v.second] + 1; q.push({nx, ny}); } } return dist; }; vector<vector<int>> bee_dist = bee_dist_gen(); vector<vector<bool>> vis(n, vector<bool>(n, false)); priority_queue<node> q; q.push({start.first, start.second, bee_dist[start.first][start.second], 0, 0}); vis[start.first][start.second] = true; int ans = -1; while (!q.empty()) { node v = q.top(); /* cout << v.x << ' ' << v.y << ' ' << v.mx << ' ' << v.step << ' ' << v.dist << '\n'; */ q.pop(); if (end.first == v.x && end.second == v.y) ans = max(ans, v.mx); if (v.step == s - 1) v.dist++; for (int i = 0; i < 4; i++) { int nx = v.x + dx[i], ny = v.y + dy[i]; if (nx < 0 || ny < 0 || nx >= n || ny >= n) continue; if (ar[nx][ny] == 'T') continue; if (bee_dist[nx][ny] < v.dist) continue; if (vis[nx][ny]) continue; vis[nx][ny] = true; q.push({nx, ny, min(v.mx, bee_dist[nx][ny] - v.dist), (v.step + 1) % s, v.dist}); } } cout << ans << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...