Submission #843118

#TimeUsernameProblemLanguageResultExecution timeMemory
843118Mizo_CompilerTracks in the Snow (BOI13_tracks)C++17
27.40 / 100
2062 ms964172 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef double ld; #define pb push_back #define sz(x) int(x.size()) #define all(x) x.begin(),x.end() #define F first #define S second const int N = 4000; int n, m, ans = 1, sz[N][N]; pair<int, int> p[N][N]; char c[N][N]; bool fc[N][N]; int dx[] = {1, -1, 0, 0}; int dy[] = {0, 0, 1, -1}; void dfs(int i, int j) { fc[i][j] = true; for (int ii = 0; ii < 4; ii++) { int nx = i + dx[ii], ny = j + dy[ii]; if (nx >= 0 && ny >= 0 && nx < n && ny < m && c[nx][ny] == c[0][0] && !fc[nx][ny]) { dfs(nx, ny); } } } pair<int, int> findp(int i, int j) { return p[i][j] = (p[i][j].F == i && p[i][j].S == j ? p[i][j] : findp(p[i][j].F, p[i][j].S)); } void merge(int i, int j, int x, int y) { pair<int, int> f = findp(i, j), s = findp(x, y); if (f == s)return; if (sz[s.F][s.S] > sz[f.F][f.S])swap(f, s); p[s.F][s.S] = f; } int main () { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> c[i][j]; p[i][j] = {i, j}; sz[i][j] = 1; } } dfs(0, 0); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (c[i][j] == '.')continue; for (int k = 0; k < 4; k++) { int nx = i + dx[k], ny = j + dy[k]; if (nx < 0 || ny < 0 || nx >= n || ny >= m)continue; if (c[nx][ny] == c[i][j] || fc[nx][ny]) { merge(i, j, nx, ny); } } } } for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (c[i][j] == '.')continue; if (p[i][j].F == i && p[i][j].S == j) { ans++; } } } cout << ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...