Submission #1276163

#TimeUsernameProblemLanguageResultExecution timeMemory
1276163mnnit_prakhargMecho (IOI09_mecho)C++20
40 / 100
254 ms8788 KiB
#pragma GCC optimize("O3", "inline") #include <bits/stdc++.h> using namespace std; typedef long long int ll; typedef long double ld; #define pb push_back #define ub upper_bound const ll INF = 1e18 + 100; vector<int> ra = {-1, 0, 1, 0}; vector<int> ca = {0, 1, 0, -1}; int f(int n, vector<string> &a, int s, int m, vector<int> &sp, vector<int> &ep, vector<vector<ll>> &ftm) { vector<vector<int>> v(n, vector<int>(n, 0)); if (ftm[sp[0]][sp[1]] <= m) return 0; queue<vector<int>> q; q.push({sp[0], sp[1], m}); v[sp[0]][sp[1]] = 1; while (!q.empty()) { for (int i = 0; i < s; i++) { int sz = q.size(); for (int j = 0; j < sz; j++) { auto del = q.front(); q.pop(); for (int d = 0; d < 4; d++) { int nr = del[0] + ra[d], nc = del[1] + ca[d]; if (nr >= 0 && nr < n && nc >= 0 && nc < n && (a[nr][nc] == 'G' || a[nr][nc] == 'D') && ftm[nr][nc] > del[2] && !v[nr][nc]) { if(nr == ep[0] && nc == ep[1]) return 1; q.push({nr, nc, (i == s - 1 ? del[2] + 1 : del[2])}); v[nr][nc] = 1; } } } } } return 0; } ll solve() { int n, s; cin >> n >> s; vector<string> a(n); for (int i = 0; i < n; i++) cin >> a[i]; vector<int> sp(2), ep(2); for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) { if (a[i][j] == 'M') sp = {i, j}; if (a[i][j] == 'D') ep = {i, j}; } vector<vector<ll>> ftm(n, vector<ll>(n, INF)); { queue<pair<int, int>> q; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) { if (a[i][j] == 'H') { ftm[i][j] = 0; q.push({i, j}); } } while (!q.empty()) { int sz = q.size(); for (int i = 0; i < sz; i++) { auto del = q.front(); q.pop(); for (int d = 0; d < 4; d++) { int nr = del.first + ra[d], nc = del.second + ca[d]; if (nr >= 0 && nr < n && nc >= 0 && nc < n && (a[nr][nc] == 'G' || a[nr][nc] == 'M') && ftm[nr][nc] == INF) { ftm[nr][nc] = ftm[del.first][del.second] + 1; q.push({nr, nc}); } } } } } int l = 0, h = 2 * n, ma = -1; while (l <= h) { int m = (l + h) / 2; if (f(n, a, s, m, sp, ep, ftm)) { ma = m; l = m + 1; } else h = m - 1; } return ma; } signed main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int t = 1; while (t--) { ll x = solve(); cout << x << "\n"; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...