Submission #1253314

#TimeUsernameProblemLanguageResultExecution timeMemory
1253314nasjesAirplane (NOI23_airplane)C++20
100 / 100
428 ms45832 KiB
#include <iostream>
#include <iomanip>
#include <vector>
#include <cmath>
#include <algorithm>
#include <set>
#include <queue>
#include <map>
#include <stack>
#include <bitset>
#include <string>
#include <cstring>
#include <iterator>
#include <random>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef long double ld;
const ll dim = 1e6+7;
//const ll mod = 1e9 + 7;
const ll inf = 1e17 + 77;
//#define endl "\n"
#define fi first
#define pb push_back
#define se second
#define vll vector<ll>

ll n, m,k, t;
ll h[dim];


vll a[dim];
ll mn1[dim], mnn[dim];
void dey(ll st, ll *dst){
    dst[st]=0;
    set<pll> s;
    while(s.size()>0){
        ll v=(*s.begin()).se;
        for(auto x:a[v]){
            ll w=max<ll>(dst[v],h[x]);
            if(dst[x]>w){
                s.erase({ dst[x], x});
                dst[x]=w;
                s.insert({dst[x], x});
            }
        }
    }
}
int main() {

    ll  u,v, w, q, l, r;
    cin>>n>>m;
    for(int i=1; i<=n; i++){
        cin>>h[i];
        mn1[i]=inf;
        mnn[i]=inf;
    }
    for(int i=1; i<=m; i++){
        cin>>u>>v;
        a[u].pb(v);
        a[v].pb(u);
    }
    mn1[1]=0;
    set<pll> s;
    s.insert({0, 1});
    while(s.size()>0){
        ll v=(*s.begin()).se;
        s.erase(s.begin());
        for(auto x:a[v]){
            ll w=max<ll>(mn1[v]+1,h[x]);
            if(mn1[x]>w){
                s.erase({ mn1[x], x});
                mn1[x]=w;
                s.insert({mn1[x], x});
            }
        }
    }
    mnn[n]=0;
    s.insert({0, n});
    while(s.size()>0){
        ll v=(*s.begin()).se;
        s.erase(s.begin());
        for(auto x:a[v]){
            ll w=max<ll>(mnn[v]+1,h[x]);
            if(mnn[x]>w){
                s.erase({ mnn[x], x});
                mnn[x]=w;
                s.insert({mnn[x], x});
            }
        }
    }
/*    for(int i=1; i<=n; i++){
        cout<<mn1[i]<<" ";
    }
    cout<<endl;
    for(int i=1; i<=n; i++){
        cout<<mnn[i]<<" ";
    }*/
    ll ans=inf;
    for(int i=1; i<=n; i++){
        if(mn1[i]>=mnn[i])ans=min(ans, 2*mn1[i]);
        for(auto x: a[i]){
            if(mn1[i]>=mnn[x]){
                ans=min(ans, 2*mn1[i]+1);
            }
        }
    }
    cout<<ans<<endl;


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