Submission #1295946

#TimeUsernameProblemLanguageResultExecution timeMemory
1295946chaitanyamehtaAirplane (NOI23_airplane)C++20
100 / 100
208 ms21532 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...