Submission #92025

#TimeUsernameProblemLanguageResultExecution timeMemory
92025arman_ferdousMecho (IOI09_mecho)C++17
10 / 100
560 ms66560 KiB
#include <bits/stdc++.h>
using namespace std;

typedef pair<int,int> ii;
const int N = 802;
const int inf = 2e9;

int n, S, d[N][N], dist[N][N];
char s[N][N];
queue<ii> q;
ii mecho, home;

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

bool can(int T) {
	for(int i = 0; i < n; i++)
		for(int j = 0; j < n; j++)
			dist[i][j] = -1;
	q.push(mecho);
	dist[mecho.first][mecho.second] = 0;
	ii u; int arrival, tx, ty;
	while(!q.empty()) {
		u = q.front(); q.pop();
		for(int i = 0; i < 4; i++) {
			tx = u.first + dx[i], ty = u.second + dy[i];
			if(min(tx,ty) < 0 || max(tx,ty) >= n) continue;
			if(s[tx][ty] != 'G' && s[tx][ty] != 'D') continue;
			arrival = dist[u.first][u.second] / S + 1 + T;
			if(arrival > d[tx][ty] || dist[tx][ty] != -1) continue;
			dist[tx][ty] = dist[u.first][u.second] + 1;
			q.push({tx,ty});
		}
	} 
	return dist[home.first][home.second] != -1;
}

int main() {
	scanf("%d %d", &n, &S);
	for(int i = 0; i < n; i++)
		scanf(" %s", s[i]);

	for(int i = 0; i < n; i++)
		for(int j = 0; j < n; j++) {
			d[i][j] = inf;
			if(s[i][j] == 'M') mecho = {i,j};
			else if(s[i][j] == 'D') home = {i,j};
		}
	s[mecho.first][mecho.second] = 'G';
	for(int i = 0; i < n; i++)
		for(int j = 0; j < n; j++) 
			if(s[i][j] == 'H') {
				q.push({i,j});
				d[i][j] = 0;
			}

	while(!q.empty()) {
		ii u = q.front(); q.pop();
		for(int i = 0; i < 4; i++) {
			int tx = u.first + dx[i], ty = u.second + dy[i];
			if(min(tx,ty) < 0 || max(tx,ty) >= n) continue;
			if(s[tx][ty] != 'G') continue;
			if(d[tx][ty] < d[u.first][u.second] + 1) continue;
			d[tx][ty] = d[u.first][u.second] + 1;
			q.push({tx,ty});
		}
	}
	int lo = 0, hi = n + n, ans = -1;
	while(lo <= hi) {
		int mid = (lo + hi) >> 1;
		if(can(mid)) ans = mid, lo = mid+1;
		else hi = mid-1;
	} printf("%d\n", ans);
	return 0;
}

Compilation message (stderr)

mecho.cpp: In function 'int main()':
mecho.cpp:39:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d", &n, &S);
  ~~~~~^~~~~~~~~~~~~~~~~
mecho.cpp:41:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf(" %s", s[i]);
   ~~~~~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...