#include "walk.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
long long min_distance(vector<int> x, vector<int> h, vector<int> l, vector<int> r, vector<int> y, int A, int B) {
int n = x.size(), m = l.size();
int cont = 0;
vector<vector<pair<ll, ll>>> adj;
multiset<pair<ll, ll>> s[n];
auto create = [&]( int id, int alt ){
// cout << "+ " << id << " " << alt << endl;
s[id].insert({ alt, cont });
adj.emplace_back();
return cont++;
};
for( int i = 0; i < m; i++ ){
ll last = -1;
ll pos = -1;
for( int j = l[i]; j <= r[i]; j++ ) if( y[i] <= h[j] ){
int a = create( j, y[i] );
// cout << a << " " << last << endl;
if( last != -1 ){
adj[a].push_back({ last, x[j] - pos });
adj[last].push_back({ a, x[j] - pos });
}
last = a;
pos = x[j];
}
}
vector<int> v(n);
for( int i = 0; i < n; i++ ){
int last = -1;
int pos = -1;
v[i] = create( i, 0 );
for( auto [alt, a] : s[i] ){
// cout << a << " " << last << " " << alt - pos << endl;
if( last != -1 ){
adj[a].push_back({ last, alt - pos });
adj[last].push_back({ a, alt - pos });
}
last = a;
pos = alt;
}
}
vector<ll> dist(cont, 1e18);
auto dijkstra = [&]( int source ){
set<pair<ll, ll>> ss;
ss.insert({ 0, source });
dist[source] = 0;
while( !ss.empty() ){
int cur = ss.begin()->second; ss.erase(ss.begin());
// cout << " " << cur << " " << dist[cur] << endl;
for( auto [viz, d] : adj[cur] ) if( dist[viz] > dist[cur] + d ){
ss.erase({ dist[viz], viz });
dist[viz] = dist[cur] + d;
ss.insert({ dist[viz], viz });
}
}
};
dijkstra( v[A] );
if( dist[v[B]] == 1e18 ) dist[v[B]] = -1;
return dist[v[B]];
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |