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"
#ifdef NYAOWO
#include "grader.cpp"
#endif
#include <bits/stdc++.h>
#define For(i, a, b) for(int i = a; i <= b; i++)
#define Forr(i,a, b) for(int i = a; i >= b; i--)
#define F first
#define S second
#define all(x) x.begin(), x.end()
#define sz(x) ((int)x.size())
#define eb emplace_back
#define int LL
using namespace std;
using LL = long long;
using pii = pair<int, int>;
using Vi = vector<int32_t>;
const int MAXN = 100010;
const int INF = 2e9;
int n, m;
Vi st[MAXN], ed[MAXN];
int solve_1n(Vi x, Vi h, Vi l, Vi r, Vi y) {
For(i, 0, m - 1) {
st[l[i]].eb(y[i]);
ed[r[i]].eb(y[i]);
}
map<int, int> mp;
mp[0] = INF; mp[INF] = INF;
for(auto &i:st[0]) mp[i] = i;
auto eval = [&](int p, int hei) {
auto it1 = mp.upper_bound(p);
auto it2 = prev(it1);
int res = p - (it2->F) + (it2->S);
if(it1->F <= hei) {
res = min(res, (it1->F) - p + (it1->S));
}
// cout << (it1->F) << " " << (it1->S) << "\n";
// cout << (it2->F) << " " << (it2->S) << "\n";
return res;
};
For(i, 1, n - 2) {
set<int> upd;
for(auto &j:st[i]) {
int k = eval(j, h[i]);
mp[j] = k;
upd.insert(j);
}
for(auto &j:ed[i]) if(!upd.count(j)) {
mp.erase(j);
}
}
// cout << "\n";
// for(auto &p:mp) cout << p.F << " " << p.S << "\n";
// cout << "\n";
int ans = eval(0, h[n - 1]) + x.back() - x[0];
if(ans >= INF) return -1;
return ans;
}
long long min_distance(Vi x, Vi h, Vi l, Vi r, Vi y, int32_t s, int32_t g) {
n = sz(x);
m = sz(l);
return solve_1n(x, h, l, r, y);
}
# | 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... |