#include <bits/stdc++.h>
#include "walk.h"
// #include "grader.cpp"
using namespace std;
typedef long long ll;
const int N = 1e7 + 10;
ll dist[N];
vector<pair<ll, int>> g[N];
void dijkstra(int v){
memset(dist, 31, sizeof dist);
dist[v] = 0;
set<pair<ll, int>> st;
st.insert({0, v});
while (!st.empty()){
auto [d, v] = *st.begin();
st.erase(st.begin());
for (auto [w, u] : g[v]){
if (dist[u] > dist[v] + w){
st.erase({dist[u], u});
dist[u] = dist[v] + w;
st.insert({dist[u], u});
}
}
}
}
ll min_distance(vector<int> x, vector<int> h, vector<int> l, vector<int> r, vector<int> y, int s, int e) {
int n = x.size(), m = l.size();
int cur = 0;
map<pair<int, int>, int> id;
vector<int> vec[n];
for (int i = 0; i < m; i ++){
vector<int> buildings;
for (int j = l[i]; j <= r[i]; j ++){
if (h[j] < y[i]) continue;
buildings.push_back(j);
vec[j].push_back(y[i]);
id[{j, y[i]}] = cur++;
}
for (int j = 0; j + 1 < buildings.size(); j ++){
int u = id[{buildings[j], y[i]}], v = id[{buildings[j + 1], y[i]}], w = x[buildings[j + 1]] - x[buildings[j]];
g[u].push_back({w, v});
g[v].push_back({w, u});
}
}
for (int i = 0; i < n; i ++){
id[{i, 0}] = cur++;
vec[i].push_back(0);
sort(vec[i].begin(), vec[i].end());
for (int j = 0; j + 1 < vec[i].size(); j ++){
int u = id[{i, vec[i][j]}], v = id[{i, vec[i][j + 1]}], w = vec[i][j + 1] - vec[i][j];
g[u].push_back({w, v});
g[v].push_back({w, u});
}
}
dijkstra(id[{s, 0}]);
if (dist[id[{e, 0}]] > 1e15)
return -1;
return dist[id[{e, 0}]];
}
# | 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... |