제출 #399453

#제출 시각아이디문제언어결과실행 시간메모리
399453ruadhanMecho (IOI09_mecho)C++17
73 / 100
276 ms6500 KiB
#include <bits/stdc++.h> #define sz(x) (int)x.size() #define x first #define y second #define X 0 #define Y 1 #define TIME 2 #define STEPS 3 using namespace std; typedef pair<int, int> pi; const int MX = 805; string grid[MX]; int bees_time[MX][MX]; int N, S; vector<pi> hives; vector<pi> dirs = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}}; void calc_bee_times() { queue<pi> q; for (auto i : hives) { q.push(i); bees_time[i.x][i.y] = 0; } while (!q.empty()) { auto curr = q.front(); q.pop(); for (auto d : dirs) { int i = curr.x + d.x, j = curr.y + d.y; if (i < 0 || i >= N || j < 0 || j >= N || grid[i][j] == 'T' || grid[i][j] == 'M' || bees_time[i][j] != -1) continue; bees_time[i][j] = bees_time[curr.x][curr.y] + 1; q.push({i, j}); } } } pi mecho, home; int processed[MX][MX]; bool ok(int t) { for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) processed[i][j] = 0; } queue<array<int, 4>> q; processed[mecho.x][mecho.y] = 1; q.push({mecho.x, mecho.y, t, 0}); while (!q.empty()) { auto curr = q.front(); // cout << "new queue top " << '\n'; // cout << curr[X] << " " << curr[Y] << " " << curr[TIME] << " " << curr[STEPS] << '\n'; q.pop(); for (auto d : dirs) { int i = curr[X] + d.x, j = curr[Y] + d.y; int new_steps = (curr[STEPS] + 1) % S; int time = curr[TIME] + (new_steps == 0); if (i < 0 || i >= N || j < 0 || j >= N || grid[i][j] == 'T' || bees_time[i][j] <= time || processed[i][j] == 1) continue; // cout << "we can go to " << i << ", " << j << ", with time = " << time << ", and stps = " << new_steps << '\n'; processed[i][j] = 1; q.push({i, j, time, new_steps}); } } return processed[home.x][home.y] == 1; } int main() { cin >> N >> S; for (int i = 0; i < MX; i++) for (int j = 0; j < MX; j++) bees_time[i][j] = -1; for (int i = 0; i < N; i++) { cin >> grid[i]; for (int j = 0; j < N; j++) { if (grid[i][j] == 'H') hives.push_back({i, j}); else if (grid[i][j] == 'M') mecho.x = i, mecho.y = j; else if (grid[i][j] == 'D') home.x = i, home.y = j; } } calc_bee_times(); // cout << ok(3) << '\n'; // for (int i = 0; i < N; i++) // { // for (int j = 0; j < N; j++) // cout << bees_time[i][j] << " "; // cout << '\n'; // } int lo = 0, hi = 800 * 800; for (int b = hi / 2; b >= 1; b /= 2) { while (lo + b < hi && ok(lo + b)) lo += b; } if (lo == 0 && !ok(0)) cout << -1 << '\n'; else cout << lo << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...