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 <bits/stdc++.h>
#define fi first
#define se second
#define ssize(x) int(x.size())
#define pn printf("\n")
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(), x.rend()
#define vv vector
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<int, ll> pil;
typedef pair<ll, int> pli;
int inf = 2e09; ll infll = 2e18; int mod = 119<<23|1;
ll min_distance(vv<int> x, vv<int> h, vv<int> l, vv<int> r, vv<int> y, int s, int e){
int n = ssize(x), m = ssize(y);
vv<set<int>> beg(n), ed(n);
for(int i = 0; i < m; ++i) beg[l[i]].emplace(y[i]), ed[r[i]].emplace(y[i]);
for(int i = 0; i < n; ++i){
vv<int> to_remove;
for(int u : beg[i]){
auto it = lower_bound(all(ed[i]), u);
if(it != ed[i].end() && *it == u) to_remove.emplace_back(u);
}
for(int u : to_remove) beg[i].erase(u), ed[i].erase(u);
}
set<int> active;
vv<vv<pii>> g(1);
int cnt = 0;
map<pii, int> mp;
int a = -1, b = -1;
for(int i = 0; i < n; ++i){
vv<pii> nr;
if(i == s || i == e){
nr.emplace_back(++cnt, 0), g.emplace_back(vv<pii>());
if(a == -1) a = cnt;
else b = cnt;
mp[pii(i, 0)] = cnt;
}
for(int u : beg[i]) active.emplace(u);
for(int u : active){
if(u > h[i]) break;
mp[pii(i, u)] = ++cnt, nr.emplace_back(cnt, u), g.emplace_back(vv<pii>());
}
for(int u : ed[i]) active.erase(u);
//~ printf("%d:\n", i);
for(int j = 0; j < ssize(nr)-1; ++j) g[nr[j].fi].emplace_back(nr[j+1].fi, abs(nr[j].se-nr[j+1].se)), g[nr[j+1].fi].emplace_back(nr[j].fi, abs(nr[j].se-nr[j+1].se));
//~ pn;
}
map<int, int> last;
for(int i = 0; i < n; ++i){
//~ printf("%d:\n", i);
for(int u : active){
if(u > h[i]) break;
//~ printf("%d %d, ", u, abs(x[last[u]]-x[i]));
g[mp[pii(i, u)]].emplace_back(mp[pii(last[u], u)], abs(x[last[u]]-x[i])), g[mp[pii(last[u], u)]].emplace_back(mp[pii(i, u)], abs(x[last[u]]-x[i]));
last[u] = i;
}
//~ pn;
for(int u : beg[i]) active.emplace(u), last[u] = i;
for(int u : ed[i]) active.erase(u), last[u] = 0;
}
n = ssize(g)-1;
vv<ll> dist(n+1, infll);
dist[a] = 0; priority_queue<pli> pq; pq.emplace(0, a);
while(ssize(pq)){
int X = pq.top().se; ll d = -pq.top().fi; pq.pop();
if(dist[X] != d) continue;
for(pii u : g[X])
if(d+u.se < dist[u.fi])
dist[u.fi] = d+u.se, pq.emplace(-dist[u.fi], u.fi);
}
if(dist[b] == infll) return -1;
else return dist[b];
return 0;
}
#ifdef LOCAL
signed main(){
int T = 1;
for(++T; --T; ){
int n, m, s, g; scanf("%d%d", &n, &m);
vv<int> x(n), h(n), l(m), r(m), y(m);
for(int i = 0; i < n; ++i) scanf("%d", &x[i]);
for(int i = 0; i < n; ++i) scanf("%d", &h[i]);
for(int i = 0; i < m; ++i) scanf("%d", &l[i]);
for(int i = 0; i < m; ++i) scanf("%d", &r[i]);
for(int i = 0; i < m; ++i) scanf("%d", &y[i]);
scanf("%d%d", &s, &g);
ll result = min_distance(x, h, l, r, y, s, g);
printf("%lld\n", result);
}
return 0;
}
#endif
# | 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... |