Submission #1121152

#TimeUsernameProblemLanguageResultExecution timeMemory
1121152buzdiMecho (IOI09_mecho)C++17
21 / 100
108 ms7012 KiB
#include <iostream> #include <cassert> #include <cstring> #include <queue> #define ll long long using namespace std; const int NMAX = 800; const int di[] = { 0, 0, 1, -1 }; const int dj[] = { 1, -1, 0, 0 }; struct Triplet { int i, j, k; }; int n, s, istart, jstart, ifinal, jfinal; char a[NMAX + 1][NMAX + 1]; int dh[NMAX + 1][NMAX + 1], d[NMAX + 1][NMAX + 1]; queue<pair<int, int>> qh; bool InMat(int i, int j) { return i >= 1 && i <= n && j >= 1 && j <= n; } void BFS_hives(queue<pair<int, int>>& q) { while (!q.empty()) { auto [i, j] = q.front(); q.pop(); for(int d = 0; d < 4; d++) { int inou = i + di[d]; int jnou = j + dj[d]; if (InMat(inou, jnou) && (a[inou][jnou] == 'G' || a[inou][jnou] == 'M') && !dh[inou][jnou]) { dh[inou][jnou] = dh[i][j] + 1; q.push({ inou, jnou }); } } } } void BFS(int istart, int jstart, int t) { for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { d[i][j] = 0; } } if (dh[istart][jstart] <= t) { return; } queue<Triplet> q; d[istart][jstart] = 1; q.push({ istart, jstart, 0 }); while (!q.empty()) { auto [i, j, k] = q.front(); q.pop(); for (int dir = 0; dir < 4; dir++) { int inou = i + di[dir]; int jnou = j + dj[dir]; if (InMat(inou, jnou) && a[inou][jnou] != 'T' && !d[inou][jnou]) { int nxt_d = d[i][j] + (k == s ? 1 : 0); if (dh[inou][jnou] == 0 || nxt_d + t < dh[inou][jnou]) { d[inou][jnou] = nxt_d; q.push({ inou, jnou, (k == s ? 1 : k + 1)}); } } } } } void Print(int d[NMAX + 1][NMAX + 1]) { for (int i = 1; i <= n; i++, cout << '\n') { for (int j = 1; j <= n; j++) { cout << d[i][j] << ' '; } } cout << '\n'; } signed main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> s; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { cin >> a[i][j]; } } for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if (a[i][j] == 'M') { istart = i; jstart = j; } else if (a[i][j] == 'D') { ifinal = i; jfinal = j; } else if (a[i][j] == 'H') { dh[i][j] = 1; qh.push({ i, j }); } } } BFS_hives(qh); int left = 1, right = 2 * n, answer = -1; while (left <= right) { int mid = (left + right) / 2; BFS(istart, jstart, mid); if (d[ifinal][jfinal]) { answer = mid; left = mid + 1; } else { right = mid - 1; } } cout << answer << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...