#include "walk.h"
// #pragma GCC optimize("trapv")
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define sz(x) (int)(x).size()
typedef int32_t i32;
// typedef pair<int, int> ii;
typedef tuple<int, i32, i32> iii;
// typedef vector<int> vi;
typedef vector<int32_t> vi32;
// typedef vector<ii> vii;
// typedef vector<vi> vvi;
// typedef vector<vii> vvii;
// typedef set<ii> sii;
typedef unordered_map<i32, int> mii;
#define loop(n, i) for (i32 i = 0; i < n; i++)
int INF = 1e18;
int min_distance(vi32 x, vi32 h, vi32 l, vi32 r, vi32 y, i32 s, i32 g)
{
i32 n = sz(x), m = sz(l);
vector<unordered_map<i32, vi32>> adj(n);
loop(m, i)
{
for (i32 p = l[i]; p <= r[i]; p++)
{
if (h[p] < y[i])
continue;
for (i32 p2 = l[i]; p2 <= r[i]; p2++)
{
if (h[p2] < y[i])
continue;
if (p == p2)
continue;
adj[p][i].pb(p2);
}
}
}
priority_queue<iii, vector<iii>, greater<iii>> q;
vector<mii> disList(n);
auto dis = [&](i32 p, i32 y) -> int
{
if (disList[p].count(y))
return disList[p][y];
return INF;
};
int starty = -1;
for (auto [yix, _] : adj[s])
{
starty = yix;
}
q.push({y[starty], s, starty});
while (!q.empty())
{
auto [d, p, yix] = q.top();
q.pop();
if (dis(p, yix) < d)
continue;
disList[p][yix] = d;
for (i32 p2 : adj[p][yix])
{
int d2 = d + abs(x[p2] - x[p]);
if (d2 < dis(p2, yix))
{
disList[p2][yix] = d2;
q.push({d2, p2, yix});
}
}
for (auto [y2, _] : adj[p])
{
int d2 = d + abs(y[y2] - y[yix]);
if (d2 < dis(p, y2))
{
disList[p][y2] = d2;
q.push({d2, p, y2});
}
}
}
int res = INF;
for (auto [yix, _] : adj[g])
{
res = min(res, dis(g, yix) + y[yix]);
}
if (res == INF)
return -1;
return res;
}
# | 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... |