제출 #1355077

#제출 시각아이디문제언어결과실행 시간메모리
1355077gayMaze (JOI23_ho_t3)C++20
100 / 100
778 ms241852 KiB
#include <bits/stdc++.h>
#include <experimental/random>
#include <random>

//#include <ext/pb_ds/assoc_container.hpp>
//using namespace __gnu_pbds;

using namespace std;

using ld = long double;
using ll = long long;

const ll INF = 1e18, MOD = 1e9 + 7;

void solve();

signed main() {
#ifdef LOCAL
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif
    ios::sync_with_stdio(false);
    cin.tie(0);
    int q = 1;
    //cin >> q;
    while (q--) {
        solve();
    }
}

vector<pair<ll, ll>> cord = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};

void solve() {
    ll r, c, n;
    cin >> r >> c >> n;
    ll sr, sc, gr, gc;
    cin >> sr >> sc >> gr >> gc;
    sr--, sc--, gr--, gc--;
    vector<vector<char>> a(r, vector<char>(c));
    for (int i = 0; i < r; i++) {
        for (int j = 0; j < c; j++) {
            cin >> a[i][j];
        }
    }
    if (r > c) {
        swap(r, c);
        swap(sr, sc); swap(gr, gc);
        vector<vector<char>> nw(r, vector<char>(c));
        for (int i = 0; i < r; i++) {
            for (int j = 0; j < c; j++) {
                nw[i][j] = a[j][i];
            }
        }
        a = nw;
    }

    if (n >= r) {
        queue<pair<ll, ll>> bfs;
        bfs.emplace(sr, sc);
        vector<vector<ll>> used(r, vector<ll>(c));
        used[sr][sc] = 1;
        ll mn = sc, mx = sc;
        while (!empty(bfs)) {
            auto [i, j] = bfs.front();
            bfs.pop();
            mn = min(mn, j); mx = max(mx, j);
            for (auto [fx, fy] : cord) {
                ll x = i + fx, y = j + fy;
                if (x < 0 || y < 0 || x == r || y == c || a[x][y] == '#') {
                    continue;
                }
                if (used[x][y]) {
                    continue;
                }
                used[x][y] = 1;
                bfs.emplace(x, y);
            }
        }
        ll col = 0;
        ll lf = sc + 1, rf = sc - 1;
        while (!used[gr][gc]) {
            ll nwl = max(0ll, mn - n), nwr = min(c - 1, mx + n);
            for (int i = 0; i < r; i++) {
                for (ll j = nwl; j < lf; j++) {
                    used[i][j] = 1;
                }
                for (ll j = rf + 1; j <= nwr; j++) {
                    used[i][j] = 1;
                }
            }
            col++;
            lf = nwl, rf = nwr;
            for (int i = 0; i < r; i++) {
                bfs.emplace(i, lf);
                bfs.emplace(i, rf);
            }
            while (!empty(bfs)) {
                auto [i, j] = bfs.front();
                bfs.pop();
                mn = min(mn, j); mx = max(mx, j);
                for (auto [fx, fy] : cord) {
                    ll x = i + fx, y = j + fy;
                    if (x < 0 || y < 0 || x == r || y == c || a[x][y] == '#') {
                        continue;
                    }
                    if (used[x][y]) {
                        continue;
                    }
                    used[x][y] = 1;
                    bfs.emplace(x, y);
                }
            }
        }
        cout << col;
        return;
    }

    vector<vector<ll>> used(r, vector<ll>(c));
    ll col = 0;
    queue<pair<ll, ll>> bfs;
    bfs.emplace(sr, sc);
    used[sr][sc] = 1;
    vector<pair<ll, ll>> elems;

    while (!bfs.empty()) {
        auto [i, j] = bfs.front();
        bfs.pop();
        elems.emplace_back(i, j);
        for (auto [fx, fy] : cord) {
            ll x = i + fx, y = j + fy;
            if (x < 0 || y < 0 || x == r || y == c || a[x][y] == '#') {
                continue;
            }
            if (used[x][y]) {
                continue;
            }
            used[x][y] = 1;
            bfs.emplace(x, y);
        }
    }

    while (!used[gr][gc]) {
        if (n >= 100) {
            vector<vector<ll>> add(r + 1, vector<ll>(c + 1));
            for (auto [x, y]: elems) {
                ll x1 = max(0ll, x - (n - 1)), y1 = max(0ll, y - n);
                ll x2 = min(r - 1, x + (n - 1)), y2 = min(c - 1, y + n);
                add[x1 + 1][y1 + 1]++;
                if (x2 + 1 < r && y2 + 1 < c) {
                    add[x2 + 2][y2 + 2]++;
                }
                if (y2 + 1 < c) {
                    add[x1 + 1][y2 + 2]--;
                }
                if (x2 + 1 < r) {
                    add[x2 + 2][y1 + 1]--;
                }
                if (x - n >= 0) {
                    x1 = x - n, y1 = max(0ll, y - (n - 1));
                    x2 = x - n, y2 = min(c - 1, y + (n - 1));
                    add[x1 + 1][y1 + 1]++;
                    if (x2 + 1 < r && y2 + 1 < c) {
                        add[x2 + 2][y2 + 2]++;
                    }
                    if (y2 + 1 < c) {
                        add[x1 + 1][y2 + 2]--;
                    }
                    if (x2 + 1 < r) {
                        add[x2 + 2][y1 + 1]--;
                    }
                }
                if (x + n < r) {
                    x1 = x + n, y1 = max(0ll, y - (n - 1));
                    x2 = x + n, y2 = min(c - 1, y + (n - 1));
                    add[x1 + 1][y1 + 1]++;
                    if (x2 + 1 < r && y2 + 1 < c) {
                        add[x2 + 2][y2 + 2]++;
                    }
                    if (y2 + 1 < c) {
                        add[x1 + 1][y2 + 2]--;
                    }
                    if (x2 + 1 < r) {
                        add[x2 + 2][y1 + 1]--;
                    }
                }
            }
            for (int i = 1; i <= r; i++) {
                for (int j = 1; j <= c; j++) {
                    add[i][j] += add[i - 1][j] + add[i][j - 1] - add[i - 1][j - 1];
                    if (add[i][j]) {
                        bfs.emplace(i - 1, j - 1);
                        used[i - 1][j - 1] = 1;
                    }
                }
            }
        } else {
            for (auto [x, y] : elems) {
                for (int i = max(0ll, x - n); i <= min(r - 1, x + n); i++) {
                    ll lf = max(0ll, y - n), rf = min(c - 1, y + n);
                    if (abs(x - i) == n) {
                        lf = max(0ll, y - n + 1), rf = min(c - 1, y + n - 1);
                    }
                    for (ll j = lf; j <= rf; j++) {
                        if (!used[i][j]) {
                            used[i][j] = 1;
                            bfs.emplace(i, j);
                        }
                    }
                }
            }
        }

        vector<pair<ll, ll>> nw;
        while (!bfs.empty()) {
            auto [i, j] = bfs.front();
            bfs.pop();
            nw.emplace_back(i, j);
            for (auto [fx, fy] : cord) {
                ll x = i + fx, y = j + fy;
                if (x < 0 || y < 0 || x == r || y == c || a[x][y] == '#') {
                    continue;
                }
                if (used[x][y]) {
                    continue;
                }
                used[x][y] = 1;
                bfs.emplace(x, y);
            }
        }
        elems = nw;
        col++;
    }
    cout << col;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...