Submission #843179

#TimeUsernameProblemLanguageResultExecution timeMemory
843179Youssif_ElkadiTracks in the Snow (BOI13_tracks)C++17
97.81 / 100
719 ms1048576 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;
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)
{
    if (vis[i][j] || fc[i][j])
        return;
    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] && !vis[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...