Submission #607338

#TimeUsernameProblemLanguageResultExecution timeMemory
607338beabossMecho (IOI09_mecho)C++14
73 / 100
435 ms21428 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

int main() {
	ll n, s;

	cin >> n>> s;

	vector<vector<char> > grid(n, vector<char>(n));
	queue<pair<ll ,ll> > q1;
	queue<pair<ll ,ll> > q2;
	pair<ll ,ll> home;
	pair<ll ,ll> start;


	vector<vector<ll> > hdist(n, vector<ll>(n, -1));

	for (ll i = 0; i < n; i++) for (ll j = 0; j < n; j++) {
		cin >> grid[i][j];
		if (grid[i][j] == 'H') {
			q1.push({i, j});
			hdist[i][j] = 0;
		}
		else if (grid[i][j] == 'M') {
			// q2.push({i, j});
			
			start = {i, j};

		}
		else if (grid[i][j] == 'D') home = {i, j};
	}

	
	vector<ll> dx = {1, -1, 0, 0};
	vector<ll> dy = {0, 0, -1, 1};
	while (!q1.empty() && hdist[home.first][home.second] == -1) {
		pair<ll, ll> curr = q1.front();
		q1.pop();

		for (ll i = 0; i < 4; i++) {
			ll x = curr.first + dx[i];
			ll y = curr.second + dy[i];
			if (x >= 0 && x < n && y >= 0 && y < n) {
				if (hdist[x][y] == -1 && (grid[x][y] == 'G' || grid[x][y] == 'D')) {
					hdist[x][y] = hdist[curr.first][curr.second] + s;
					q1.push({x, y});
					
				}
			}
		}

	}

	vector<vector<pair<ll, ll> > > parent(n, vector<pair<ll, ll> >(n, {-1, -1}));
	ll hi = n*n;
	ll lo = 0;
	while (hi > lo || (hi == 0 && lo == 0)) {

		ll mid = (hi + lo + 1)/2;
		// cout << hi << lo << endl;
		vector<vector<ll> > mdist(n, vector<ll>(n, -1));
		mdist[start.first][start.second] = mid * s;
		q2.push(start);
		// cout << hdist[3][1] << endl;
		while (!q2.empty()) {
			pair<ll, ll> curr = q2.front();
			// cout << mdist[curr.first][curr.second] << endl;
			q2.pop();


			for (ll i = 0; i < 4; i++) {
				ll x = curr.first + dx[i];
				ll y = curr.second + dy[i];
				if (x >= 0 && x < n && y >= 0 && y < n) {
					if (mdist[x][y] == -1 && (grid[x][y] == 'G' || grid[x][y] == 'D') && (hdist[x][y] > mdist[curr.first][curr.second] + 1 || hdist[x][y ] == -1)) {
						mdist[x][y] = mdist[curr.first][curr.second] + 1;
						q2.push({x, y});
						
						parent[x][y] = {curr.first, curr.second};
					}
				}
			}

		}
		if (mdist[home.first][home.second] != -1) {
			lo = mid;
			if (hi == 0 && lo == 0) break;
		} else {
			hi = mid - 1;
		}
	}
	// ll ans = 100000000;
	// pair<ll ,ll> current = home;
	// // cout << mdist[home.first][home.second] << endl;
	// if (mdist[home.first][home.second] == -1) {
	// 	cout << -1 << endl;
	// 	return 0;
	// }

	// while (current != start) {
	// 	ll x = current.first;
	// 	ll y = current.second;
	// 	if (hdist[x][y] != -1) {
	// 		// cout << x << y << hdist[x][y] << endl;
	// 		ans = min(ans, hdist[x][y]-mdist[x][y]);
	// 	}
	// 	current = parent[x][y];
	// }
	// for (ll i = 0; i < 4; i++) {
	// 	ll x = home.first + dx[i];
	// 	ll y = home.second + dy[i];
	// 	if (x >= 0 && x < n && y >= 0 && y < n && grid[x][y] != 'T') {
	// 		ans = max(hdist[x][y] - mdist[x][y], ans);
	// 		cout << mdist[x][y] << hdist[x][y] << x << y << endl;
	// 	}
	// }
	cout << hi << endl;


	
	
}
#Verdict Execution timeMemoryGrader output
Fetching results...