Submission #1121302

#TimeUsernameProblemLanguageResultExecution timeMemory
1121302buzdiMecho (IOI09_mecho)C++17
100 / 100
159 ms7008 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 }; 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] == -1) { 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] = -1; } } if (dh[istart][jstart] <= t) { return; } queue<pair<int, int>> q; d[istart][jstart] = 0; q.push({ istart, jstart }); while (!q.empty()) { auto [i, j] = 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] == -1) { if (dh[inou][jnou] == -1 || (d[i][j] + 1) / s < dh[inou][jnou] - t) { d[inou][jnou] = d[i][j] + 1; q.push({ inou, jnou }); } } } } } 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++) { dh[i][j] = -1; } } 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] = 0; qh.push({ i, j }); } } } BFS_hives(qh); int left = 0, right = n * n, answer = -1; while (left <= right) { int mid = (left + right) / 2; BFS(istart, jstart, mid); if (d[ifinal][jfinal] != -1) { answer = mid; left = mid + 1; } else { right = mid - 1; } } cout << answer << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...