#include "walk.h"
#include <bits/stdc++.h>
#define sz(a) (int)a.size()
#define int long long
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
using namespace std;
int n,m;
long long min_distance(std::vector<signed> x, std::vector<signed> h, std::vector<signed> l, std::vector<signed> r, std::vector<signed> y, signed s, signed g) {
n=sz(x);
m=sz(l);
vector<vector<int>> neighB(n+m);
vector<pair<int,pair<int,int>>> bridge(m); // (y, (l,r))
vector<pair<int,int>> building(n); // (h,x)
for (int i = 0; i < n; i++) building[i]={h[i],x[i]};
s=x[s];
g=x[g];
for (int i = 0; i < m; i++) bridge[i]={y[i],{x[l[i]],x[r[i]]}};
sort(rall(building));
sort(rall(bridge));
for (int i = 0; i < n; i++) { if(building[i].second==s){ s=i; break; } }
for (int i = 0; i < n; i++) { if(building[i].second==g){ g=i; break; } }
set<pair<int,int>> buildset; //(x, i)
int j=0;
for (int i = 0; i < m; i++)
{
while(j<n&&building[j].first>=bridge[i].first){
buildset.insert({building[j].second,j});
j++;
}
auto it=buildset.lower_bound({bridge[i].second.first,-1});
while(it!=buildset.end()&&(*it).first<=bridge[i].second.second){
neighB[i+n].push_back((*it).second);
neighB[(*it).second].push_back(i+n);
it++;
}
}
map<pair<int,int>,int> dist;
map<pair<int,int>,bool> visit;
priority_queue<pair<int,pair<int,int>>> pq;
dist[{s,0}]=0;
pq.push({0,{s,0}});
int mn=1e18;
while(!pq.empty()){
pair<int,pair<int,int>> u=pq.top(); pq.pop();
if(visit[u.second]==true) continue;
visit[u.second]=true;
int ps=0;
u.first=-u.first;
if(u.second.first<n) { ps=building[u.second.first].second; }
else { ps=bridge[u.second.first-n].first; }
if(u.second.first==g) {
mn=min(mn,u.first+u.second.second);
}
for (auto v : neighB[u.second.first])
{
int cst=0;
if(v<n) cst=building[v].second;
else cst=bridge[v-n].first;
cst=abs(u.second.second-cst);
int d=dist[{v,ps}];
if(d==0||d>cst+u.first){
d=cst+u.first;
dist[{v,ps}]=d;
pq.push({-d,{v,ps}});
}
}
}
return mn;
}
# | 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... |