Submission #708511

#TimeUsernameProblemLanguageResultExecution timeMemory
708511MathandskiTracks in the Snow (BOI13_tracks)C++17
100 / 100
1639 ms833972 KiB
#define pb push_back
#define mt make_tuple
#define mp make_pair
#define is insert
#define ll long long
#define f0r(i, begin, end) for (ll i = begin; i < end; i ++) 
#define len(x) x.size()
#include <bits/stdc++.h>
using namespace std;

int N, M, grid[4000][4000];

void ffill (int x, int y, int col, int org) {
	if(x < 0 || x >= N || y < 0 || y >= M) return;
	if(grid[x][y] == org) {
		grid[x][y] = col;
		ffill(x - 1, y, col, org);
		ffill(x + 1, y, col, org);
		ffill(x, y - 1, col, org);
		ffill(x, y + 1, col, org);
	}
}

int main () {
	ios_base::sync_with_stdio(0); cin.tie(nullptr);
	cin >> N >> M;
	f0r (i, 0, N) {
		f0r (j, 0, M) {
			char a; cin >> a;
			if(a == '.') grid[i][j] = -3;
			else if(a == 'F') grid[i][j] = -2;
			else grid[i][j] = -1;
		}
	}
	int col = 0;
	f0r (i, 0, N) {
		f0r (j, 0, M) {
			if(grid[i][j] == -1 || grid[i][j] == -2) {
				ffill(i, j, col ++, grid[i][j]);
			}
		}
	}
	
	set<int> conn[col];
	f0r (i, 0, N) {
		f0r (j, 0, M) {
			if(i > 0) {
				if(grid[i][j] >= 0 && grid[i - 1][j] >= 0 && grid[i][j] != grid[i - 1][j]) {
					conn[grid[i][j]].is(grid[i - 1][j]);
					conn[grid[i - 1][j]].is(grid[i][j]);
				}
			}
			if(j > 0) {
				if(grid[i][j] >= 0 && grid[i][j - 1] >= 0 && grid[i][j] != grid[i][j - 1]) {
					conn[grid[i][j]].is(grid[i][j - 1]);
					conn[grid[i][j - 1]].is(grid[i][j]);
				}
			}
		}
	}

	int dist[col];
	f0r (i, 0, col) dist[i] = -1;
	dist[grid[0][0]] = 0;

	int m = 0;
	queue<int> q;
	q.push(grid[0][0]);
	
	while(!q.empty()) {
		int pos = q.front();
		q.pop();
		for (auto c : conn[pos]) {
			if(dist[c] == -1) {
				q.push(c);
				dist[c] = dist[pos] + 1;
				m = max(m, dist[c]);
			}
		}
	}

	cout << m + 1 << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...