Submission #1255361

#TimeUsernameProblemLanguageResultExecution timeMemory
1255361ChuanChenMecho (IOI09_mecho)C++20
100 / 100
436 ms8964 KiB
#include<bits/stdc++.h>
using namespace std;

const int MAXN = 810;

int n, s, fx, fy;
char g[MAXN][MAXN];

#define ff first
#define ss second
int dist[MAXN][MAXN], type[MAXN][MAXN];
int vis[MAXN][MAXN];
//type: 0 -- grass, 1 -- mecho, 2 -- hive, 3 -- tree;

int dx[] = {0, 1, 0, -1},
	dy[] = {1, 0, -1, 0};
bool inbound(int x, int y){
	return 1<=x && x <= n && 1 <= y && y <= n;
}
void print(){
	for(int x = 1; x <= n; x++){
		for(int y = 1; y <= n; y++)
			cout << type[x][y];
		cout << '\n';
	}
	cout << '\n';
}
queue<pair<int, int>> bq, mq;

void expandBee(){
	if(bq.empty()) return;
	int x = bq.front().ff, y = bq.front().ss;
	int dini = dist[x][y];
	while(!bq.empty()){
		int x = bq.front().ff, y = bq.front().ss;
		if(dist[x][y] > dini) break;
		bq.pop();
		for(int i = 0; i < 4; i++){
			int nx = x+dx[i], ny = y+dy[i];
			if(!inbound(nx, ny) || vis[nx][ny] > 1) continue;
			if(type[nx][ny] < 2){
				type[nx][ny] = 2;
				dist[nx][ny] = dist[x][y]+1;
				bq.push({nx, ny});
				vis[nx][ny] = 2;
			}
		}
	}
}

void expandMecho(){
	while(!mq.empty()){
		int x = mq.front().ff, y = mq.front().ss;
		if(type[x][y] == 2) mq.pop();
		else break;
	}
	if(mq.empty()) return;
	int x = mq.front().ff, y = mq.front().ss;
	int dini = dist[x][y];
	while(!mq.empty()){
		int x = mq.front().ff, y = mq.front().ss;
		if(dist[x][y] >= dini+s) break;
		mq.pop();
		if(type[x][y] == 2) continue;
		for(int i = 0; i < 4; i++){
			int nx = x+dx[i], ny = y+dy[i];
			if(!inbound(nx, ny) || vis[nx][ny] > 0) continue;
			if(type[nx][ny] < 2 || type[nx][ny] == 4){
				type[nx][ny] = 1;
				dist[nx][ny] = dist[x][y]+1;
				mq.push({nx, ny});
				vis[nx][ny] = 1;
			}
		}
	}
}

bool guess(int m){
	while(mq.size()) mq.pop();
	while(bq.size()) bq.pop();
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= n; j++){
			vis[i][j] = dist[i][j] = 0;
			if(g[i][j] == 'G') type[i][j] = 0;
			else if(g[i][j] == 'M') type[i][j] = 1, mq.push({i, j}), vis[i][j] = 1;
			else if(g[i][j] == 'H') type[i][j] = 2, bq.push({i, j}), vis[i][j] = 2;
			else if(g[i][j] == 'T') type[i][j] = 3;
			else if(g[i][j] == 'D') type[i][j] = 4;
		}
	}
	for(int i = 1; i <= m; i++) expandBee();
	while(type[fx][fy] == 4){
		expandMecho();
		if(bq.empty()) return false;
		if(type[fx][fy] == 1) return true;
		expandBee();
	}
	return false;
}

int main(){
	cin >> n >> s;
	// assert(n <= 60);
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= n; j++){
			cin >> g[i][j];
			if(g[i][j] == 'D') fx = i, fy = j;
		}
	if(!guess(0)){
		cout << -1;
		return 0;
	}
	int l = 0, r = 640000;
	while(l < r){
		int m = (l+r+1)/2;
		if(guess(m)) l = m;
		else r = m-1;
	}
	cout << l << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...