Submission #1138320

#TimeUsernameProblemLanguageResultExecution timeMemory
1138320anmattroiTracks in the Snow (BOI13_tracks)C++17
12.08 / 100
1130 ms614880 KiB
#include <bits/stdc++.h> #define maxn 4005 #define fi first #define se second using namespace std; using ii = pair<int, int>; int n, m; char a[maxn][maxn]; int cl[maxn][maxn]; int dv[4] = {0, 1, 0, -1}; int dh[4] = {1, 0, -1, 0}; int par[maxn*maxn]; int nho[maxn*maxn], id = 0; int find_set(int v) { return par[v] < 0 ? v : par[v] = find_set(par[v]); } void union_set(int u, int v) { u = find_set(u); v = find_set(v); if (u == v) return; if (par[u] < par[v]) swap(u, v); par[v] += par[u]; par[u] = v; } void bfs(int ox, int oy) { queue<ii> q; q.push(ii{ox, oy}); cl[ox][oy] = ++id; while (!q.empty()) { auto [u, v] = q.front(); q.pop(); for (int k = 0; k < 4; k++) { int i = u + dv[k], j = v + dh[k]; if (1 <= i && 1 <= j && i <= n && j <= m && !cl[i][j] && a[i][j] == a[u][v]) { cl[i][j] = 1; q.push(ii{i, j}); } } } } vector<int> adj[maxn*maxn]; int main() { ios::sync_with_stdio(false); cin.tie(NULL); cin >> n >> m; for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) cin >> a[i][j]; fill(par+1, par+n*m+1, -1); for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) if (a[i][j] != '.' && !cl[i][j]) bfs(i, j); for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) for (int k = 0; k < 4; k++) { int u = i + dv[k], v = j + dh[k]; if (1 <= u && u <= n && 1 <= v && v <= m && a[i][j] != '.' && a[u][v] != '.' && a[u][v] != a[i][j]) { if (find_set(cl[i][j]) == find_set(cl[u][v])) continue; adj[cl[i][j]].emplace_back(cl[u][v]); adj[cl[u][v]].emplace_back(cl[i][j]); union_set(cl[i][j], cl[u][v]); } } queue<int> q; nho[1] = 1; q.push(1); while (!q.empty()) { int u = q.front(); q.pop(); for (int v : adj[u]) if (!nho[v]) { nho[v] = nho[u]+1; q.push(v); } } cout << *max_element(nho + 1, nho + id + 1); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...