제출 #876678

#제출 시각아이디문제언어결과실행 시간메모리
876678MisterReaperMecho (IOI09_mecho)C++17
73 / 100
150 ms8016 KiB
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;

const int MAXN = 800 + 5;

char matrix[MAXN][MAXN];
int distBee[MAXN][MAXN];
int distBear[MAXN][MAXN];

int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};

#define ONLINE_JUDGE
void solve() {
	memset(distBee, -1, sizeof(distBee));

	int n, s;
	cin >> n >> s;

	pair <int, int> initial;
	pair <int, int> home;

	queue <array <int, 3>> q;
	for(int i = 1; i <= n; i++) {
		for(int j = 1; j <= n; j++) {
			cin >> matrix[i][j];
			if(matrix[i][j] == 'H') {
				q.push({0, i, j});
			} else if(matrix[i][j] == 'M') {
				initial = {i, j};
			} else if(matrix[i][j] == 'D') {
				home = {i, j};
			}
		}
	}

	auto in = [&](int x, int y) -> bool {
		return 1 <= min(x, y) && max(x, y) <= n;
	};

	while(!q.empty()) {
		auto [d, x, y] = q.front();
		q.pop();
		if(distBee[x][y] != -1) {
			continue;
		}

		distBee[x][y] = d;
		for(int dir = 0; dir < 4; dir++) {
			int _x = x + dx[dir], _y = y + dy[dir];
			if(in(_x, _y) && (matrix[_x][_y] == 'D' || matrix[_x][_y] == 'G')) {
				q.push({d +1, _x, _y});
			}
		}
	}

	auto check = [&](int k) -> bool {
		memset(distBear, -1, sizeof(distBear));

		q.push({s * k, initial.first, initial.second});
		while(!q.empty()) {
			auto [d, x, y] = q.front();
			q.pop();
			if(distBear[x][y] != -1 || (distBee[x][y] != -1 && d >= distBee[x][y] * s)) {
				continue;
			}

			//cerr << d << " :: " << x << " " << y << " | " << distBee[x][y] << "\n";
			distBear[x][y] = d;
			for(int dir = 0; dir < 4; dir++) {
				int _x = x + dx[dir], _y = y + dy[dir];
				if(in(_x, _y) && (matrix[_x][_y] == 'G' || matrix[_x][_y] == 'D') && distBear[_x][_y] == -1) {
					q.push({d +1, _x, _y});
				}
			}
		}

		if(distBear[home.first][home.second] == -1) {
			return false;
		}

		return true;
	};
	
	int l = 0, r = n * n + 2, ans = -1;
	while(l <= r) {
		int mid = (l + r) / 2;
		if(check(mid)) {
			ans = mid;
			l = mid +1;
		} else {
			r = mid -1;
		}
	}

	cout << ans;

	return;
}

signed main() {
	#ifndef ONLINE_JUDGE
		freopen(".in", "r", stdin);
		freopen(".out", "w", stdout);
	#endif

	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	int t = 1; //cin >> t;
	for(int i = 1; i <= t; i++) {
		solve();
	}

	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...