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...