#include "walk.h"
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int n;
vector<vector<int>> adj;
ll min_distance(vector<int> x, vector<int> h, vector<int> l, vector<int> r,
vector<int> y, int s, int g) {
map<int, vector<int>> bridge_by_y;
for (int i = 0; i < y.size(); i++) {
if (!bridge_by_y.count(y[i]))
bridge_by_y[y[i]] = vector<int>();
bridge_by_y[y[i]].push_back(i);
}
priority_queue<tuple<ll, ll, ll>> que;
que.push({0, s, 0});
map<pair<ll, ll>, ll> dists;
while (que.size()) {
auto [dist, building, height] = que.top();
que.pop();
dist *= -1;
if (dists.count({building, height}) && dists[{building, height}] < dist)
continue;
for (int i = 0; i < l.size(); i++)
if (l[i] <= building && building <= r[i] && y[i] <= h[building]) {
ll new_dist = dist + abs(height - y[i]);
if (!dists.count({building, y[i]}) ||
new_dist < dists[{building, y[i]}]) {
dists[{building, y[i]}] = new_dist;
que.push({-new_dist, building, y[i]});
}
}
if (!bridge_by_y.count(height))
continue;
for (int bridge : bridge_by_y[height]) {
if (!(l[bridge] <= building && building <= r[bridge]))
continue;
for (int build = l[bridge]; build <= r[bridge]; build++) {
if (y[bridge] > h[build])
continue;
ll new_dist = dist + abs(x[build] - x[building]);
if (!dists.count({build, height}) ||
new_dist < dists[{build, height}]) {
dists[{build, height}] = new_dist;
que.push({-new_dist, build, height});
}
}
}
}
ll ans = -1;
for (auto [key, dist] : dists) {
auto [building, height] = key;
if (building == g)
if (ans == -1 || dist + height < ans)
ans = dist + height;
}
return ans;
}
# | 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... |