#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;
int gdist(pair<int,int> a, pair<int,int> b){
return (abs(a.first-b.first)+abs(a.second-b.second));
}
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<pair<int,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;
int k=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,k});
neighB[(*it).second].push_back({i+n,k});
k++;
it++;
}
}
vector<pair<int,int>> inter(k+n);
vector<vector<int>> neigh(n+k);
s=k+s;
g=k+g;
for (int i = 0; i < n; i++)
{
inter[k+i]={building[i].second,0};
int last=k+i;
for (int j = sz(neighB[i])-1; j>=0; j--)
{
neigh[last].push_back(neighB[i][j].second);
neigh[neighB[i][j].second].push_back(last);
inter[neighB[i][j].second]={building[i].second,bridge[neighB[i][j].first-n].first};
last=neighB[i][j].second;
}
}
for (int i = n; i < n+m; i++)
{
for (int j = 1; j<sz(neighB[i]); j++)
{
neigh[neighB[i][j].second].push_back(neighB[i][j-1].second);
neigh[neighB[i][j-1].second].push_back(neighB[i][j].second);
}
}
vector<int> dist(k+n,1e17);
vector<bool> visit(k+n);
priority_queue<pair<int,int>> pq;
dist[s]=0;
pq.push({0,s});
while(!pq.empty()){
int u=pq.top().second; pq.pop();
if(visit[u]==true) continue;
visit[u]=true;
//cerr << inter[u].first << " " << inter[u].second << ": " << dist[u] << "\n";
for (auto v : neigh[u])
{
int cst=gdist(inter[u],inter[v]);
if(dist[v]>cst+dist[u]) {
dist[v]=cst+dist[u];
pq.push({-dist[v],v});
}
}
}
if(dist[g]==1e17) return -1;
return dist[g];
}
# | 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... |