Submission #113163

#TimeUsernameProblemLanguageResultExecution timeMemory
113163joseacazMecho (IOI09_mecho)C++17
100 / 100
342 ms12992 KiB
#include <iostream>
#include <queue>
#define MAXN 805
#define INF (1LL << 40LL)
#define pii pair < lld, lld >
#define mp make_pair

using namespace std;
typedef long long lld;

lld N, S, bees[MAXN][MAXN], answer[MAXN][MAXN], Mx, My, x, y, s, e, mid, ans, ansX, ansY;
bool visited[MAXN][MAXN], val;
char forest[MAXN][MAXN];
pii aux;
queue < pii > Q;
lld dx[] = {1, -1, 0, 0};
lld dy[] = {0, 0, 1, -1};

bool valid ( lld _x, lld _y )
{
	if ( _x < 0 || _x >= N )
		return false;
	if ( _y < 0 || _y >= N )
		return false;
	if ( visited[_x][_y] || forest[_x][_y] == 'T' || forest[_x][_y] == 'D')
		return false;

	return true;
}

bool valid2 ( lld _x, lld _y )
{
	if ( _x < 0 || _x >= N )
		return false;
	if ( _y < 0 || _y >= N )
		return false;

	return true;
}

bool validM ( lld _x, lld _y )
{
	if ( _x < 0 || _x >= N )
		return false;
	if ( _y < 0 || _y >= N )
		return false;
	if ( visited[_x][_y] || forest[_x][_y] == 'T')
		return false;

	return true;
}

bool solve ( lld v )
{
	for ( lld i = 0; i < N; i++ )
		for ( lld j = 0; j < N; j++ )
			answer[i][j] = INF, visited[i][j] = 0;
	
	while ( !Q.empty() )
		Q.pop();

	Q.push ( mp ( Mx, My ) );
	answer[Mx][My] = S * v;

	while ( !Q.empty() )
	{
		aux = Q.front();
		Q.pop();

		x = aux.first;
		y = aux.second;

		if ( x == ansX && y == ansY )
			return true;

		if ( answer[x][y] < bees[x][y] )
		{
			for ( lld i = 0; i < 4; i++ )
			{
				if ( validM ( x + dx[i], y + dy[i] ) )
				{
					Q.push ( mp ( x + dx[i], y + dy[i] ) );
					answer[x + dx[i]][y + dy[i]] = answer[x][y] + 1;
					visited[x + dx[i]][y + dy[i]] = 1;
				}
			}
		}
	}
	return false;
}

int main ()
{
	cin >> N >> S;
	for ( lld i = 0; i < N; i++ )
	{
		for ( lld j = 0; j < N; j++ )
		{
			bees[i][j] = INF;
			cin >> forest[i][j];
			if ( forest[i][j] == 'H' )
			{
				Q.push ( mp ( i, j ) );
				bees[i][j] = 0;
				visited[i][j] = 1;
			}

			if ( forest[i][j] == 'M' )
				Mx = i, My = j;

			if ( forest[i][j] == 'D' )
				ansX = i, ansY = j;
		}
	}

	while ( !Q.empty() )
	{
		aux = Q.front();
		Q.pop();

		x = aux.first;
		y = aux.second;

		for ( lld i = 0; i < 4; i++ )
		{
			if ( valid ( x + dx[i], y + dy[i] ) )
			{
				Q.push ( mp ( x + dx[i], y + dy[i] ) );
				bees[x + dx[i]][y + dy[i]] = bees[x][y] + S;
				visited[x + dx[i]][y + dy[i]] = 1;
			}
		}
	}

	ans = -1;
	s = 0, e = (1<<20);
	while ( s <= e )
	{
		mid = (s + e) / 2;
		val = solve ( mid );

		if ( val )
		{
			ans = mid;
			s = mid + 1;
		}
		else
			e = mid - 1;
	}

	cout << ans << "\n";

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