Submission #1184972

#TimeUsernameProblemLanguageResultExecution timeMemory
1184972epicci23Airplane (NOI23_airplane)C++20
100 / 100
309 ms30028 KiB
#include "bits/stdc++.h" #define int long long #define all(v) v.begin() , v.end() #define sz(a) (int)a.size() using namespace std; const int INF = 1e18; void _(){ int n, m; cin >> n >> m; int ar[n+5]; for(int i=1;i<=n;i++) cin >> ar[i]; vector<int> v[n+5]; priority_queue<array<int,2>,vector<array<int,2>>,greater<>> pq; bool ok = 0; for(int i=1;i<=m;i++){ int a,b; cin >> a >> b; if(a == 1 && b == n) ok = 1; if(b == 1 && a == n) ok = 1; v[a].push_back(b); v[b].push_back(a); } if(ok){ cout << 1 << '\n'; return; } vector<int> dist(n+5,INF),dp(n+5,0),mx(n+5,0); dist[1] = 0; pq.push({0, 1}); while(!pq.empty()){ int c = pq.top()[1]; int d = pq.top()[0]; pq.pop(); if(d > dist[c]) continue; if(c == n) continue; for(int u : v[c]){ int xd = d + 1; if(dp[c] + 1 < ar[u]) xd += ar[u] - dp[c] - 1; if(xd < dist[u]){ dist[u] = xd; mx[u] = max(ar[u], mx[c]); dp[u] = max(dp[c] + 1, ar[u]); pq.push({dist[u], u}); } } } vector<int> dist2(n+5,INF),dp2(n+5,0),mx2(n+5,0); dist2[n] = 0; pq.push({0, n}); while(!pq.empty()){ int c = pq.top()[1]; int d = pq.top()[0]; pq.pop(); if(d > dist2[c]) continue; if(c == 1) continue; for(int u : v[c]){ int xd = d + 1; if(dp2[c] + 1 < ar[u]) xd += ar[u] - dp2[c] - 1; if(xd < dist2[u]){ dist2[u] = xd; mx2[u] = max(mx2[c], ar[u]); dp2[u] = max(dp2[c] + 1, ar[u]); pq.push({dist2[u], u}); } } } //for(int i=1;i<=n;i++){ // cout << i << ' ' << dist[i] << ' ' << dist2[i] << '\n'; //} int ans = INF; for(int i=2;i<n;i++) if(max(mx2[i],mx[i]) == ar[i]) ans = min(ans, dist[i] + dist2[i]); cout << ans << '\n'; } int32_t main(){ cin.tie(0); ios::sync_with_stdio(0); int tc=1;//cin >> tc; while(tc--) _(); 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...