Submission #1315863

#TimeUsernameProblemLanguageResultExecution timeMemory
1315863DormonTracks in the Snow (BOI13_tracks)C++20
100 / 100
1973 ms162296 KiB
#include <iostream>
#include <vector>
#include <queue>

using namespace std;

struct heap {
    int i, j, w;
    bool operator < (const heap &o) const {
        return w > o.w;
    }
};

vector<pair<int, int>> dir = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    int n, m;
    cin >> n >> m;
    vector<string> grid(n);
    for (auto &s:grid) cin >> s;

    auto invalid = [&](int i, int j) -> bool {
        return i < 0 || i >= n || j < 0 || j >= m || grid[i][j] == '.';
    };

    priority_queue<heap> pq;
    vector<vector<int>> dist(n, vector<int>(m, 0));
    vector<vector<bool>> vis(n, vector<bool>(m, false));
    dist[0][0] = 1;
    vis[0][0] = true;
    pq.push({0, 0, 1});
    int ans = 0;
    while (!pq.empty()){
        auto [i, j, W] = pq.top(); pq.pop();
        ans = max(ans, dist[i][j]);
        for (auto [di, dj]:dir){
            if (invalid(i + di, j + dj) || vis[i + di][j + dj]) continue;
            if (grid[i + di][j + dj] != grid[i][j]){
                dist[i + di][j + dj] = dist[i][j] + 1;
                vis[i + di][j + dj] = true;
                pq.push({i + di, j + dj, dist[i][j] + 1});
            }
            else {
                dist[i + di][j + dj] = dist[i][j];
                vis[i + di][j + dj] = true;
                pq.push({i + di, j + dj, dist[i][j]});
            }
        }
    }
    // for (int i = 0;i < n;i++){
    //     for (int j = 0;j < m;j++)
    //         cout << dist[i][j] << ' ';
    //     cout << '\n';
    // }
    cout << ans << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...