Submission #484836

#TimeUsernameProblemLanguageResultExecution timeMemory
484836PoPularPlusPlusMecho (IOI09_mecho)C++17
84 / 100
207 ms9380 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long 
#define pb(e) push_back(e)
#define sv(a) sort(a.begin(),a.end())
#define sa(a,n) sort(a,a+n)
#define mp(a,b) make_pair(a,b)
#define vf first
#define vs second
#define ar array
#define all(x) x.begin(),x.end()
const int inf = 0x3f3f3f3f;
const int mod = 1000000007; 
const double PI=3.14159265358979323846264338327950288419716939937510582097494459230;
bool remender(ll a , ll b){return a%b;}

void clear( std::queue<pair<int,int>> &q )
{
   std::queue<pair<int,int>> empty;
   std::swap( q, empty );
}

void solve(){
	int dx[4] = {0,0,-1,1} , dy[4] = {1,-1,0,0};
	int n , s;
	cin >> n >> s;
	char arr[n][n];
	for(int i = 0; i < n; i++){
		for(int j = 0; j < n; j++)cin >> arr[i][j];
	}
	queue<pair<int,int>> q;
	ll dis[n][n];
	for(int i = 0; i < n; i++){
		for(int j = 0; j < n; j++)dis[i][j] = 1e18;
	}
	bool vis[n][n];
	memset(vis,0,sizeof vis);
	pair<int,int> end, start;
	for(int i = 0; i < n; i++){
		for(int j = 0; j < n; j++){
			if(arr[i][j] == 'H'){q.push(mp(i,j));dis[i][j] = 0;vis[i][j] = 1;}
			if(arr[i][j] == 'D')end = mp(i,j);
			if(arr[i][j] == 'M')start = mp(i,j);
		}
	}
	while(q.size()){
		pair<int,int> node = q.front();
		q.pop();
		for(int i = 0; i < 4; i++){
			if(node.vf + dx[i] >= 0 && node.vf + dx[i] < n && node.vs + dy[i] < n && node.vs + dy[i] >= 0 && !vis[node.vf + dx[i]][node.vs + dy[i]] && arr[node.vf + dx[i]][node.vs + dy[i]] == 'G'){
				q.push(mp(node.vf + dx[i] , node.vs + dy[i]));
				dis[node.vf + dx[i]][node.vs + dy[i]] = dis[node.vf][node.vs] + 1;
				vis[node.vf + dx[i]][node.vs + dy[i]] = 1;
			}
		}
	}
	int dis1[n][n];
	int l = 0 , r = n * n + 3;
	if(dis[start.vf][start.vs] != 1e18)r = dis[start.vf][start.vs]-1;
	int ans = -1;
	while(l <= r){
		int mid = (l + r)/2;
		dis1[start.vf][start.vs] = s * mid;
		memset(vis,0,sizeof vis);
		vis[start.vf][start.vs] = 1;
		clear(q);
		q.push(mp(start.vf , start.vs));
		while(q.size() && !vis[end.vf][end.vs]){
			pair<int,int> node = q.front();
			q.pop();
			for(int i = 0; i < 4; i++){
				if(node.vf + dx[i] >= 0 && node.vf + dx[i] < n && node.vs + dy[i] < n && node.vs + dy[i] >= 0 && !vis[node.vf + dx[i]][node.vs + dy[i]] && (arr[node.vf + dx[i]][node.vs + dy[i]] == 'G' || arr[node.vf + dx[i]][node.vs + dy[i]] == 'D') && dis[node.vf + dx[i]][node.vs + dy[i]] > (dis1[node.vf][node.vs] + 1)/s){
					q.push(mp(node.vf + dx[i] , node.vs + dy[i]));
					dis1[node.vf + dx[i]][node.vs + dy[i]] = dis1[node.vf][node.vs] + 1;
					vis[node.vf + dx[i]][node.vs + dy[i]] = 1;
				}
			}
		}
		if(vis[end.vf][end.vs]){
			ans = mid;
			l = mid + 1;
		}
		else r = mid - 1;
	}
	cout << ans << '\n';
}

int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
	//int t;cin >> t;while(t--)
	solve();
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...