제출 #1342198

#제출 시각아이디문제언어결과실행 시간메모리
1342198nathlol2Airplane (NOI23_airplane)C++20
0 / 100
3 ms3396 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5 + 5;
int n, m, ans = LLONG_MAX, a[N], dist[N][2];
vector<int> adj[N];
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    cin >> n >> m;
    for(int i = 1;i<=n;i++) cin >> a[i]; 
    for(int i = 1;i<=m;i++){
        int u, v; cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    memset(dist, 0x3f, sizeof dist);
    dist[1][0] = 0;
    pq.push({0, 1});
    while(pq.size()){
        auto [d, u] = pq.top();
        pq.pop();
        if(d > dist[u][0]) continue;
        for(auto v : adj[u]){
            int nd = max(1LL, a[v] - a[u]);
            if(d + nd < dist[v][0]){
                dist[v][0] = d + nd;
                pq.push({d + nd, v});
            }
        }
    }
    dist[n][1] = 0;
    pq.push({0, n});
    while(pq.size()){
        auto [d, u] = pq.top();
        pq.pop();
        if(d > dist[u][1]) continue;
        for(auto v : adj[u]){
            int nd = max(1LL, a[v] - a[u]);
            if(d + nd < dist[v][1]){
                dist[v][1] = d + nd;
                pq.push({d + nd, v});
            }
        }
    }
    for(int i = 1;i<=n;i++) cout << dist[i][0] << ' ' << dist[i][1] << '\n'; 
    for(int i = 1;i<=n;i++) ans = min(ans, 2 * max(dist[i][0], dist[i][1]));
    for(int i = 1;i<=n;i++){
        for(auto x : adj[i]){
            ans = min(ans, 2 * max(dist[i][0], dist[x][1]) + 1);
        }
    }
    cout << ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...