This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "walk.h"
#include <bits/stdc++.h>
#define eb emplace_back
#define sz(V) ((int)(V).size())
#define allv(V) ((V).begin()),((V).end())
#define sorv(V) sort(allv(V))
#define revv(V) reverse(allv(V))
#define univ(V) (V).erase(unique(allv(V)),(V).end())
#define fi first
#define se second
#define INFLL (0x3f3f3f3f3f3f3f3fll)
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, int> pli;
inline void fg(vector<int> G[], int a, int b) { G[a].eb(b); G[b].eb(a); }
const int MAXN = 100055;
const int MAXM = 100055;
const int MAXK = 2000055;
struct EVT {
EVT(int type, pii p)
: type(type), p(p) {}
int type;
pii p;
bool operator < (const EVT &t) const {
if(p.fi != t.p.fi) return p.fi < t.p.fi;
return type < t.type;
}
};
vector<int> G[MAXK];
ll dp[MAXK];
vector<pii> PV;
int A[MAXN], B[MAXN];
int C[MAXM], D[MAXM], E[MAXM];
int N, M, K, Si, Ei;
ll solve() {
{
vector<pii> OV;
for(int i = N; i--;) OV.eb(-B[i], -(i+1));
for(int i = M; i--;) OV.eb(-E[i], i+1);
sorv(OV);
auto f = [&](int x) {
set<int> PQ;
for(auto &ev : OV) {
int idx = ev.se;
if(idx < 0) {
idx = -idx-1;
PQ.insert(idx);
} else {
idx--;
if(D[idx] <= x) {
auto it = PQ.find(D[idx]);
PV.eb(A[*it], E[idx]);
PV.eb(A[*prev(it)], E[idx]);
} else if(x <= C[idx]) {
auto it = PQ.find(C[idx]);
PV.eb(A[*it], E[idx]);
PV.eb(A[*next(it)], E[idx]);
} else {
auto it = PQ.upper_bound(x-1);
if(PQ.begin() != it) {
it--;
if(C[idx] <= *it && *it <= D[idx])
PV.eb(A[*it], E[idx]);
}
it = PQ.upper_bound(x);
if(PQ.end() != it && C[idx] <= *it && *it <= D[idx])
PV.eb(A[*it], E[idx]);
}
}
}
};
f(Si); f(Ei);
}
{
vector<EVT> EV;
for(int i = M; i--;) {
EV.eb(0, pii(A[C[i]], E[i]));
EV.eb(2, pii(A[D[i]], E[i]));
}
for(auto &v : PV) EV.eb(1, v);
sorv(EV);
multiset<int> PQ;
for(auto &ev : EV) {
if(!ev.type) PQ.insert(ev.p.se);
else if(1 == ev.type) {
auto it = PQ.upper_bound(ev.p.se);
if(PQ.end() != it) PV.eb(ev.p.fi, *it);
if(PQ.begin() != it && *prev(it) == ev.p.se) it--;
if(PQ.begin() != it) PV.eb(ev.p.fi, *prev(it));
} else PQ.erase(PQ.find(ev.p.se));
}
}
PV.eb(A[Si], 0); PV.eb(A[Ei], 0);
for(int i = M; i--;) {
if(C[i] <= Si && Si <= D[i] && E[i] <= B[Si]) PV.eb(A[Si], E[i]);
if(C[i] <= Ei && Ei <= D[i] && E[i] <= B[Ei]) PV.eb(A[Ei], E[i]);
}
sorv(PV); univ(PV);
{
vector<pii> V; K = sz(PV);
for(int i = 0, s = 0, e; i < N; i++, s = e) {
for(e = s; e < K && PV[e].fi == A[i]; e++);
for(int j = s; j < e; j++)
if(PV[j].se <= B[i]) V.eb(PV[j]);
}
swap(PV, V);
}
K = sz(PV);
fill(dp, dp+MAXK, INFLL);
{ int x = A[Si]; for(Si = 0; PV[Si].fi != x || PV[Si].se; Si++); }
{ int x = A[Ei]; for(Ei = 0; PV[Ei].fi != x || PV[Ei].se; Ei++); }
for(int i = 1; i < K; i++)
if(PV[i-1].fi == PV[i].fi) fg(G, i-1, i);
{
auto cmp = [&](const pii &a, const pii &b) {
if(a.se != b.se) return a.se < b.se;
return a.fi < b.fi;
};
vector<pair<pii, int>> _PV(K);
for(int i = K; i--;) _PV[i] = {PV[i], i};
sort(allv(_PV), [&](const pair<pii, int> &a, const pair<pii, int> &b) { return cmp(a.fi, b.fi); });
vector<int> OV;
for(int i = M; i--;) OV.eb(i);
sort(allv(OV), [&](int a, int b) { return cmp({A[C[a]], E[a]}, {A[C[b]], E[b]}); });
for(int i = 0, j = 0, idx; i < M; i++) {
idx = OV[i];
for(; j < K && cmp(_PV[j].fi, {A[C[idx]], E[idx]}); j++);
for(j++; j < K && _PV[j].fi.se == E[idx] && _PV[j].fi.fi <= A[D[idx]]; j++) fg(G, _PV[j-1].se, _PV[j].se);
if(j) j--;
}
}
{
priority_queue<pli, vector<pli>, greater<pli>> PQ;
dp[Si] = 0; PQ.emplace(0, Si);
for(ll dst; !PQ.empty();) {
int idx; tie(dst, idx) = PQ.top(); PQ.pop();
if(dp[idx] < dst) continue;
for(int v : G[idx]) {
ll ndst = dst + abs(PV[idx].fi - PV[v].fi) + abs(PV[idx].se - PV[v].se);
if(dp[v] <= ndst) continue;
dp[v] = ndst;
PQ.emplace(ndst, v);
}
}
}
return dp[Ei] >= INFLL ? -1 : dp[Ei];
}
long long min_distance(std::vector<int> x, std::vector<int> h, std::vector<int> l, std::vector<int> r, std::vector<int> y, int s, int g) {
::N = sz(x); ::M = sz(l);
for(int i = 0; i < ::N; i++) {
::A[i] = x[i];
::B[i] = h[i];
}
for(int i = 0; i < ::M; i++) {
::C[i] = l[i];
::D[i] = r[i];
::E[i] = y[i];
}
::Si = s; ::Ei = g;
return solve();
}
# | 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... |