제출 #843154

#제출 시각아이디문제언어결과실행 시간메모리
843154Mizo_CompilerTracks in the Snow (BOI13_tracks)C++14
97.81 / 100
832 ms1048576 KiB
#include <bits/stdc++.h> using namespace std; #pragma GCC optimize ("trapv") 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; char c[N][N]; bool fc[N][N]; int dx[] = {1, -1, 0, 0}; int dy[] = {0, 0, 1, -1}; vector<pair<int, int>> f, r; bool vis[N][N]; void dfs(int i, int j) { fc[i][j] = true; vis[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)continue; if (c[nx][ny] == c[0][0]) { if (!fc[nx][ny])dfs(nx, ny); } else if (!vis[nx][ny]) { if (c[nx][ny] == 'F')f.pb({nx, ny}); else if (c[nx][ny] == 'R')r.pb({nx, ny}); vis[nx][ny] = true; } } } 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]; } } dfs(0, 0); char cur = 'R'; if (c[0][0] == cur)cur = 'F'; while (!f.empty() || !r.empty()) { if (cur == 'R') { if (!r.empty())ans++; while (!r.empty()) { int x = r.back().F, y = r.back().S; r.pop_back(); for (int i = 0; i < 4; i++) { int nx = x + dx[i], ny = y + dy[i]; if (nx < 0 || ny < 0 || nx >= n || ny >= m)continue; if (vis[nx][ny])continue; vis[nx][ny] = true; if (c[nx][ny] == 'R')r.pb({nx, ny}); else if (c[nx][ny] == 'F')f.pb({nx, ny}); } } } else { if (!f.empty()) { ans++; } while (!f.empty()) { int x = f.back().F, y = f.back().S; f.pop_back(); for (int i = 0; i < 4; i++) { int nx = x + dx[i], ny = y + dy[i]; if (nx < 0 || ny < 0 || nx >= n || ny >= m)continue; if (vis[nx][ny])continue; vis[nx][ny] = true; if (c[nx][ny] == 'R')r.pb({nx, ny}); else if (c[nx][ny] == 'F')f.pb({nx, ny}); } } } if (cur == 'F')cur = 'R'; else cur = 'F'; } cout << ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...