제출 #1211968

#제출 시각아이디문제언어결과실행 시간메모리
1211968yanbText editor (CEOI24_editor)C++20
56 / 100
2121 ms556576 KiB
#include <bits/stdc++.h>

using namespace std;

#define int long long

using pii = pair<int, int>;

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

    int n, sx, sy, ex, ey;
    cin >> n >> sy >> sx >> ey >> ex;
    sy--; sx--; ey--; ex--;

    vector<int> l(n);
    for (int i = 0; i < n; i++) cin >> l[i];

    vector<int> xd(n + 2);
    for (int i = 0; i < n; i++) xd[i] = l[i];
    xd[n] = sx;
    xd[n + 1] = ex;
    sort(xd.begin(), xd.end());
    xd.erase(unique(xd.begin(), xd.end()), xd.end());
    int m = xd.size();

    vector<int> ld(n);
    for (int i = 0; i < n; i++) {
        ld[i] = lower_bound(xd.begin(), xd.end(), l[i]) - xd.begin();
    }
    int sxd = lower_bound(xd.begin(), xd.end(), sx) - xd.begin();
    int exd = lower_bound(xd.begin(), xd.end(), ex) - xd.begin();

    vector<vector<pii>> g(n * m); // {y, x}
    for (int y = 0; y < n; y++) {
        for (int x = 0; x <= ld[y]; x++) {
            if (y > 0) {
                g[y * m + x].emplace_back((y - 1) * m + min(x, ld[y - 1]), 1);
            }
            if (y < n - 1) {
                g[y * m + x].emplace_back((y + 1) * m + min(x, ld[y + 1]), 1);
            }
            if (x > 0) {
                g[y * m + x].emplace_back(y * m + x - 1, xd[x] - xd[x - 1]);
            } else if (y > 0) {
                g[y * m + x].emplace_back((y - 1) * m + ld[y - 1], 1);
            }
            if (x < ld[y]) {
                g[y * m + x].emplace_back(y * m + x + 1, xd[x + 1] - xd[x]);
            } else if (y < n - 1) {
                g[y * m + x].emplace_back((y + 1) * m, 1);
            }
        }
    }

    priority_queue<pii, vector<pii>, greater<pii>> q;
    vector<int> d(n * m, 1e17);
    q.emplace(0, sy * m + sxd);
    while (!q.empty()) {
        auto [dv, v] = q.top();
        q.pop();
        if (d[v] > dv) {
            d[v] = dv;
            for (auto [u, vu] : g[v]) {
                q.emplace(dv + vu, u);
            }
        }
    }

    cout << d[ey * m + exd] << "\n";
}
#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...