Submission #1303130

#TimeUsernameProblemLanguageResultExecution timeMemory
1303130chaitanyamehtaAirplane (NOI23_airplane)C++20
0 / 100
48 ms16080 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll INF = (ll)4e18;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, m;
    if (!(cin >> n >> m)) return 0;
    vector<ll> a(n);
    for (int i = 0; i < n; ++i) cin >> a[i];

    vector<vector<int>> adj(n);
    for (int i = 0; i < m; ++i) {
        int u, v; cin >> u >> v; --u; --v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }

    auto solve_from = [&](int s) {
        vector<ll> d(n, INF);
        priority_queue<pair<ll,int>, vector<pair<ll,int>>, greater<pair<ll,int>>> pq;
        d[s] = 0;
        pq.emplace(0, s);
        while (!pq.empty()) {
            auto [dt, u] = pq.top(); pq.pop();
            if (dt != d[u]) continue;
            for (int v : adj[u]) {
                // earliest time we can be at v = either move immediately (d[u] + 1),
                // or wait (raise altitude) until we satisfy a[v]
                ll nd = max(d[u] + 1, a[v]);
                if (nd < d[v]) {
                    d[v] = nd;
                    pq.emplace(nd, v);
                }
            }
        }
        return d;
    };

    vector<ll> d1 = solve_from(0);
    vector<ll> d2 = solve_from(n-1);

    ll ans = INF;
    // meet at node
    for (int i = 0; i < n; ++i) {
        if (d1[i] == INF || d2[i] == INF) continue;
        ans = min(ans, 2 * max(d1[i], d2[i]));
    }
    // meet across an edge (one step offset)
    // for (int u = 0; u < n; ++u) {
    //     for (int v : adj[u]) {
    //         if (d1[u] == INF || d2[v] == INF) continue;
    //         ans = min(ans, 2 * max(d1[u], d2[v]) + 1);
    //     }
    // }

    cout << ans << '\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...