Submission #1034941

#TimeUsernameProblemLanguageResultExecution timeMemory
1034941ArthuroWichMecho (IOI09_mecho)C++17
100 / 100
130 ms17400 KiB
#include <bits/stdc++.h> using namespace std; #define int long long int int n, s; char grid[805][805]; int hivedist[805][805], mechodist[805][805], vis[805][805]; vector<pair<int, int>> delta = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}}, hives; pair<int, int> home, mecho; bool valid(int i, int j) { return (i > 0 && j > 0 && i <= n && j <= n && (grid[i][j] == 'G' || grid[i][j] == 'H' || grid[i][j] == 'M')); } void hivebfs() { queue<pair<int, int>> q; for (auto c : hives) { q.push(c); hivedist[c.first][c.second] = 0; } while(!q.empty()) { auto [a, b] = q.front(); q.pop(); for (auto [dx, dy] : delta) { if (valid(a+dx, b+dy) && hivedist[a+dx][b+dy] > hivedist[a][b]+1) { hivedist[a+dx][b+dy] = hivedist[a][b]+1; q.push({a+dx, b+dy}); } } } } bool check(int x) { if (hivedist[mecho.first][mecho.second] <= x) { return 0; } for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { mechodist[i][j] = INT_MAX; vis[i][j] = 0; } } queue<pair<int, int>> q; q.push(mecho); mechodist[mecho.first][mecho.second] = 0; vis[mecho.first][mecho.second] = 1; while(!q.empty()) { auto [a, b] = q.front(); q.pop(); for (auto [dx, dy] : delta) { if (valid(a+dx, b+dy) && !vis[a+dx][b+dy] && (mechodist[a][b]+1)/s+x < hivedist[a+dx][b+dy]) { vis[a+dx][b+dy] = 1; mechodist[a+dx][b+dy] = mechodist[a][b]+1; q.push({a+dx, b+dy}); } } } auto [a, b] = home; for (auto [dx, dy] : delta) { if (valid(a+dx, b+dy) && vis[a+dx][b+dy]) { return 1; } } return 0; } void solve() { cin >> n >> s; for (int i = 1; i <= n; i++) { string s; cin >> s; for (int j = 1; j <= n; j++) { grid[i][j] = s[j-1]; mechodist[i][j] = INT_MAX; hivedist[i][j] = INT_MAX; if (s[j-1] == 'H') { hives.push_back({i, j}); } else if (s[j-1] == 'M') { mecho = {i, j}; } else if (s[j-1] == 'D') { home = {i, j}; } } } hivebfs(); int l = 0, r = 1e8; while(l < r) { int m = (l+r+1)/2; if (check(m)) { l = m; } else { r = m-1; } } if (check(l)) { cout << l << endl; } else { cout << -1 << endl; } } int32_t main() { ios::sync_with_stdio(0); cin.tie(0); int t; t = 1; while(t--) { solve(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...