Submission #599848

#TimeUsernameProblemLanguageResultExecution timeMemory
599848alexz1205Mecho (IOI09_mecho)C++14
22 / 100
1100 ms8568 KiB
#include <iostream>
#include <vector>
#include <set>
using namespace std;

int n, s, dist[802][802], dist2[802][802], dist3[802][802];
bool req[802][802];
pair<int, int> beg, home;
vector<pair<int, int> > hives;

void setup(){
	cin >> n >> s;
	for (int x = 1; x <= n; x ++){
		for (int y = 1; y <= n; y ++){
			dist[x][y] = dist2[x][y] = -1;
			req[x][y] = 1;
			char c;
			cin >> c;
			switch (c){
				case 'T':
					dist[x][y] = dist2[x][y] = req[x][y] = 0;
					break;
				case 'G':
					break;
				case 'M':
					beg = make_pair(x, y);
					break;
				case 'D':
					home = make_pair(x, y);
					break;
				case 'H':
					dist[x][y] = req[x][y] = dist2[x][y] = 0;
					hives.push_back(make_pair(x, y));
					break;
			}
		}
	}
	for (int x = 0; x <= n+1; x ++){
		dist[x][0] = dist[0][x] = dist[n+1][x] = dist[x][n+1] = 0;
	}
}

void calc(){
	vector<pair<int, int> > que = hives;
	while (!que.empty()){
		int i = que.front().first, j = que.front().second;
		que.erase(que.begin());
		if (dist[i-1][j] == -1){
			dist[i-1][j] = dist[i][j] + s;
			que.push_back(make_pair(i-1, j));
		}
		if (dist[i+1][j] == -1){
			dist[i+1][j] = dist[i][j] + s;
			que.push_back(make_pair(i+1, j));
		}
		if (dist[i][j-1] == -1){
			dist[i][j-1] = dist[i][j] + s;
			que.push_back(make_pair(i, j-1));
		}
		if (dist[i][j+1] == -1){
			dist[i][j+1] = dist[i][j] + s;
			que.push_back(make_pair(i, j+1));
		}
	}
}

void mecho(){
	vector<pair<int, int> > que;
	que.push_back(beg);
	while (!que.empty()){
		int i = que.front().first, j = que.front().second;
		que.erase(que.begin());
		if (dist2[i-1][j] == -1){
			dist2[i-1][j] = dist2[i][j]+1;
			que.push_back(make_pair(i-1, j));
		}
		if (dist2[i][j-1] == -1){
			dist2[i][j-1] = dist2[i][j]+1;
			que.push_back(make_pair(i, j-1));
		}
		if (dist2[i+1][j] == -1){
			dist2[i+1][j] = dist2[i][j]+1;
			que.push_back(make_pair(i+1, j));
		}
		if (dist2[i][j+1] == -1){
			dist2[i][j+1] = dist2[i][j]+1;
			que.push_back(make_pair(i, j+1));
		}
	}
}

int main() {
	setup();
	calc();
	mecho();
	for (int x = 0; x <= n+1; x ++){
		for (int y = 0; y <= n+1; y ++){
			dist3[x][y] = (dist[x][y] - dist2[x][y] >= 0 ? (dist[x][y] - dist2[x][y]) / s : -1);
		}
	}
	set<pair<int, pair<int, int> > > pri;
	pri.insert(make_pair(dist3[beg.first][beg.second], beg));
	while (!pri.empty()){
		int m = pri.rbegin()->first;
		int i = pri.rbegin()->second.first, j = pri.rbegin()->second.second;
		pri.erase(--pri.end());
		if (i == home.first && j == home.second){
			cout << m << endl;
			break;
		}
		if (req[i-1][j]){
			req[i-1][j] = 0;
			pri.insert(make_pair(min(m, dist3[i-1][j]), make_pair(i-1, j)));
		}
		if (req[i][j-1]){
			req[i][j-1] = 0;
			pri.insert(make_pair(min(m, dist3[i][j-1]), make_pair(i, j-1)));
		}
		if (req[i+1][j]){
			req[i+1][j] = 0;
			pri.insert(make_pair(min(m, dist3[i+1][j]), make_pair(i+1, j)));
		}
		if (req[i][j+1]){
			req[i][j+1] = 0;
			pri.insert(make_pair(min(m, dist3[i][j+1]), make_pair(i, j+1)));
		}
	}
	return 0;
}

Compilation message (stderr)

mecho.cpp: In function 'void setup()':
mecho.cpp:32:43: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
   32 |      dist[x][y] = req[x][y] = dist2[x][y] = 0;
      |                               ~~~~~~~~~~~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...