#include <bits/stdc++.h>
#include "walk.h"
// #include "grader.cpp"
using namespace std;
typedef long long ll;
const int N = 2e6 + 10;
ll dist[N], vis[N];
vector<pair<ll, int>> g[N];
void dijkstra(int v){
memset(dist, 31, sizeof dist);
dist[v] = 0;
priority_queue<pair<ll, int>> pq;
pq.push({0, v});
while (!pq.empty()){
auto [d, v] = pq.top();
pq.pop();
if (vis[v]) continue;
vis[v] = 1;
for (auto [w, u] : g[v]){
if (dist[u] > dist[v] + w){
dist[u] = dist[v] + w;
pq.push({-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 = 1;
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]);
if (id.find({j, y[i]}) == id.end())
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 ++){
if (id.find({i, 0}) == id.end())
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... |