Submission #895945

#TimeUsernameProblemLanguageResultExecution timeMemory
895945frostray8653Maze (JOI23_ho_t3)C++17
67 / 100
2044 ms33756 KiB
#pragma GCC optimize("Ofast, unroll-loops, O3")
#include <bits/stdc++.h>
using namespace std;
using pii = pair<int, int>;
#define IO ios::sync_with_stdio(0), cin.tie(0)
#define FOR(p, a, b) for (int p = a; p <= b; p++)
/// ---- INITIAL END ----

const int INF = 2e9;
const int N = 200005;
int r, c;
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};

inline bool inside(int x, int y) {
    return (0 <= x && x < r && 0 <= y && y < c);
}

signed main() {
    IO;
    
    int n;
    cin >> r >> c >> n;
    int sx, sy, tx, ty;
    cin >> sx >> sy >> tx >> ty;
    sx -= 1; sy -= 1; tx -= 1; ty -= 1;
    vector<string> v(r);
    FOR (i, 0, r - 1) cin >> v[i];

    vector<vector<int>> dis(r, vector<int>(c, INF));
    priority_queue<pair<int, pii>, vector<pair<int, pii>>, greater<pair<int, pii>>> Q;
    Q.push({0, {sx, sy}});
    dis[sx][sy] = 0;
    int ans = INF;
    while (! Q.empty()) {
        int step = Q.top().first;
        pii pos = Q.top().second;
        auto [x, y] = pos;
        Q.pop();
        if (ans != INF && step >= ans) {
            cout << ans << "\n";
            return 0;
        }

        if (step != dis[x][y]) continue;
        for (int i = 0; i < 4; i++) {
            int nx = x + dx[i], ny = y + dy[i];
            if (inside(nx, ny) && v[nx][ny] == '.') {
                if (step < dis[nx][ny]) {
                    if (nx == tx && ny == ty) {
                        cout << step << "\n";
                        return 0;
                    }
                    dis[nx][ny] = step;
                    Q.push({dis[nx][ny], {nx, ny}});
                }
            }
        }
        if (x - n <= tx && tx <= x + n && y - n <= ty && ty <= y + n) {
            ans = min(ans, step + 1);
            continue;
        }
        int L = max(0, x - n), R = min(r - 1, x + n);
        int D = max(0, y - n), U = min(c - 1, y + n);
        for (int nx = L, ny = D; ny <= U; ny++) {
            if (abs(nx - x) + abs(ny - y) == 2 * n) continue;
            if (step + 1 < dis[nx][ny]) {
                dis[nx][ny] = step + 1;
                Q.push({dis[nx][ny], {nx, ny}});
            }
        }
        for (int nx = R, ny = D; ny <= U; ny++) {
            if (abs(nx - x) + abs(ny - y) == 2 * n) continue;
            if (step + 1 < dis[nx][ny]) {
                dis[nx][ny] = step + 1;
                Q.push({dis[nx][ny], {nx, ny}});
            }
        }
        for (int nx = L, ny = U; nx <= R; nx++) {
            if (abs(nx - x) + abs(ny - y) == 2 * n) continue;
            if (step + 1 < dis[nx][ny]) {
                dis[nx][ny] = step + 1;
                Q.push({dis[nx][ny], {nx, ny}});
            }
        }
        for (int nx = L, ny = D; nx <= R; nx++) {
            if (abs(nx - x) + abs(ny - y) == 2 * n) continue;
            if (step + 1 < dis[nx][ny]) {
                dis[nx][ny] = step + 1;
                Q.push({dis[nx][ny], {nx, ny}});
            }
        }
    }
    cout << ans << "\n";

    return 0;
}

Compilation message (stderr)

Main.cpp:1:47: warning: bad option '-f unroll-loops' to pragma 'optimize' [-Wpragmas]
    1 | #pragma GCC optimize("Ofast, unroll-loops, O3")
      |                                               ^
Main.cpp:1:47: warning: bad option '-f O3' to pragma 'optimize' [-Wpragmas]
Main.cpp:15:32: warning: bad option '-f unroll-loops' to attribute 'optimize' [-Wattributes]
   15 | inline bool inside(int x, int y) {
      |                                ^
Main.cpp:15:32: warning: bad option '-f O3' to attribute 'optimize' [-Wattributes]
Main.cpp:19:13: warning: bad option '-f unroll-loops' to attribute 'optimize' [-Wattributes]
   19 | signed main() {
      |             ^
Main.cpp:19:13: warning: bad option '-f O3' to attribute 'optimize' [-Wattributes]
#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...