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 <iostream>
#include <queue>
#define ll long long
#define pii pair<ll, int>
#define fst first
#define snd second
using namespace std;
const ll INF = 1e15;
int N, A[5001];
ll dist[25500001];
priority_queue<pii, vector<pii>, greater<pii>> pq;
inline pair<int, int> getID(const int &x)
{
int L = 1, R = N;
while (L < R)
{
int M = L + R >> 1;
if (x < N * (N + 1) - M * (M + 1)) {L = M + 1;}
else {R = M;}
}
return {N - L, (x - N * (N + 1) + L * (L + 1)) / 2 + N - L};
}
inline int revID(const int &l, const int &r, const int &s)
{
return N * (N + 1) - (N - l) * (N - l + 1) + 2 * (r - l) + s;
}
inline bool check(int l, int m, int r) {return min(A[l], A[r]) <= A[m] && A[m] <= max(A[l], A[r]);}
inline void insert(int l, int gt, int r, int p, bool b, ll d)
{
if (gt < N && gt >= 0 && l >= 0 && r < N && check(l, gt, r))
{
int nex = (b) ? revID(l, gt, 1) : revID(gt, r, 0);
if (d + abs(A[gt] - A[p]) < dist[nex])
{
dist[nex] = d + abs(A[gt] - A[p]);
pq.push({dist[nex], nex});
}
}
}
int main()
{
cin >> N;
for (int i = 0; i < N; i++) cin >> A[i];
for (int i = 0; i < N * (N + 1); i++) dist[i] = INF;
dist[revID(0, N - 1, 0)] = 0;
pq.push({0, revID(0, N - 1, 0)});
while (pq.size())
{
if (dist[pq.top().snd] == pq.top().fst)
{
pair<int, int> u = getID(pq.top().snd); int s = pq.top().snd % 2; ll d = pq.top().fst; pq.pop();
if (u.fst == u.snd) {cout << d << "\n"; return 0;}
if (s)
{
insert(u.fst, u.snd - 1, u.fst + 1, u.snd, 1, d);
insert(u.fst, u.snd + 1, u.fst + 1, u.snd, 1, d);
insert(u.snd - 1, u.fst + 1, u.snd, u.snd, 0, d);
insert(u.snd - 1, u.fst , u.snd, u.snd, 0, d);
insert(u.snd, u.fst + 1, u.snd + 1, u.snd, 0, d);
insert(u.snd, u.fst , u.snd + 1, u.snd, 0, d);
}
else
{
insert(u.snd - 1, u.fst + 1, u.snd, u.fst, 0, d);
insert(u.snd - 1, u.fst - 1, u.snd, u.fst, 0, d);
insert(u.fst, u.snd - 1, u.fst + 1, u.fst, 1, d);
insert(u.fst, u.snd , u.fst + 1, u.fst, 1, d);
insert(u.fst - 1, u.snd - 1, u.fst, u.fst, 1, d);
insert(u.fst - 1, u.snd , u.fst, u.fst, 1, d);
}
}
else {pq.pop();}
}
cout << "-1\n";
return 0;
}
Compilation message (stderr)
climbers.cpp: In function 'std::pair<int, int> getID(const int&)':
climbers.cpp:21:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
21 | int M = L + R >> 1;
| ~~^~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |