Submission #1223474

#TimeUsernameProblemLanguageResultExecution timeMemory
1223474minhpkAirplane (NOI23_airplane)C++20
100 / 100
390 ms44640 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;
int a,b;
int cnt[1000005];
int cnt1[1000005];
int bruh=1e16;
int height[1000005];
vector <int> z[1000005];

void dijkstra(){
     for (int i=1;i<=a;i++){
          cnt[i]=bruh;
     }

     priority_queue<pair<int,int>, vector<pair<int,int>> , greater<pair<int,int>> > q;
     q.push({0,1});
     cnt[1]=0;
     while (q.size()){
         pair<int,int> pos= q.top();
         q.pop();
         int val=pos.first;
         int pos1=pos.second;

         if (val>cnt[pos1]){
             continue;
         }
         for (auto p:z[pos1]){
              if (cnt[p]>max(height[p],cnt[pos1]+1)){
                  cnt[p]=max(height[p],cnt[pos1]+1);
                  q.push({cnt[p],p});
              }
         }
     }
}

void dijkstra1(){
     for (int i=1;i<=a;i++){
          cnt1[i]=bruh;
     }

     priority_queue<pair<int,int>, vector<pair<int,int>> , greater<pair<int,int>> > q;
     q.push({0,a});
     cnt1[a]=0;
     while (q.size()){
         pair<int,int> pos= q.top();
         q.pop();
         int val=pos.first;
         int pos1=pos.second;

         if (val>cnt1[pos1]){
             continue;
         }
         for (auto p:z[pos1]){
              if (cnt1[p]>max(height[p],val+1)){
                  cnt1[p]=max(height[p],val+1);
                  q.push({cnt1[p],p});
              }
         }
     }
}

signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> a >> b;
    for (int i=1;i<=a;i++){
         cin >> height[i];
    }
    for (int i=1;i<=b;i++){
         int x,y;
         cin >> x >> y;
         z[x].push_back(y);
         z[y].push_back(x);
    }
    dijkstra();
    dijkstra1();
    int min1=1e18;
    for (int i=1;i<=a;i++){
         min1=min(min1,2*max(cnt[i],cnt1[i]));
         for (auto p:z[i]){
              min1=min(min1,2*max(cnt[i],cnt1[p])+1);
         }
    }
    cout << min1 << "\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...