Submission #1272408

#TimeUsernameProblemLanguageResultExecution timeMemory
1272408SirLemonMeringueAirplane (NOI23_airplane)C++20
0 / 100
190 ms58864 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define MAX_N 200010 #define INF 200000000000000 int a[MAX_N]; vector<int> adj[MAX_N]; unordered_map<int,int> dist[MAX_N]; int highestSeen[MAX_N]; struct P { int dest, dist, height; bool operator< (P other) const { return dist > other.dist; } }; signed main(){ int n,m; cin >> n >> m; for(int i=1;i<=n;i++) cin >> a[i]; for(int i=0;i<m;i++){ int u,v; cin >> u >> v; adj[u].push_back(v); adj[v].push_back(u); } fill(highestSeen,highestSeen+n+5,-1); priority_queue<P> todo; todo.push({1,0,0}); while(!todo.empty()){ P u = todo.top(); todo.pop(); if (u.height > highestSeen[u.dest]){ highestSeen[u.dest] = u.height; dist[u.dest][u.height] = u.dist; if (u.dest==n) continue; for(auto v : adj[u.dest]){ // do not change height if legal if (u.height >= a[v]) todo.push({v,u.dist+1,u.height}); // drop height if legal if (u.height-1 >= a[v]) todo.push({v,u.dist+1,u.height-1}); // raise height to at least a[v]-1, then increase int lift = max((int)1, a[v]-u.height); todo.push({v, u.dist+lift,u.height+lift-1}); } } } int res = INF; for(auto [a,b] : dist[n]){ res = min(res, a+b); } cout << res << '\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...