#include "jumps.h"
#include <bits/stdc++.h>
#define maxn 200005
#define fi first
#define se second
using namespace std;
using ii = pair<int, int>;
int n, h[maxn], pre[maxn], nex[maxn];
int f[20][maxn];
int jp[20][maxn], gojo[20][maxn];
ii orz[20][maxn];
void init(int N, vector<int> H) {
n = N;
for (int i = 1; i <= n; i++) h[i] = H[i-1];
h[0] = h[n+1] = INT_MAX;
for (int i = 1; i <= n; i++) {
int k = i-1;
while (h[k] < h[i]) k = pre[k];
pre[i] = k;
}
for (int i = n; i >= 1; i--) {
int k = i+1;
while (h[k] < h[i]) k = nex[k];
nex[i] = k;
}
for (int i = 1; i <= n; i++) {
jp[0][i] = pre[i];
gojo[0][i] = nex[i];
}
gojo[0][n+1] = n+1;
for (int i = 1; i <= n; i++) orz[0][i] = ii{h[i], i};
for (int i = 1; (1<<i) <= n; i++)
for (int j = 1; j + (1<<i) - 1 <= n; j++) orz[i][j] = max(orz[i-1][j], orz[i-1][j+(1<<(i-1))]);
for (int i = 1; i <= n; i++) {
if (pre[i] > 0 && nex[i] <= n) {
f[0][i] = (h[pre[i]] > h[nex[i]] ? pre[i] : nex[i]);
continue;
}
if (pre[i] > 0) {
f[0][i] = pre[i];
continue;
}
if (nex[i] <= n) {
f[0][i] = nex[i];
continue;
}
f[0][i] = n+1;
}
f[0][n+1] = n+1;
for (int i = 1; i < 20; i++) for (int j = 1; j <= n+1; j++) f[i][j] = f[i-1][f[i-1][j]];
for (int i = 1; i < 20; i++) {
for (int j = 0; j <= n; j++) jp[i][j] = jp[i-1][jp[i-1][j]];
for (int j = 1; j <= n+1;j++)gojo[i][j] = gojo[i-1][gojo[i-1][j]];
}
}
ii get_max(int u, int v) {
int k = __lg(v-u+1);
return max(orz[k][u], orz[k][v-(1<<k)+1]);
}
int kc[maxn];
int minimum_jumps(int A, int B, int C, int D) {
++A; ++B; ++C; ++D;
ii m = get_max(B, C-1), m2 = get_max(C, D);
if (m.fi > m2.fi) return -1;
int lo = A-1, hi = B;
while (hi - lo > 1) {
int mid = (lo + hi) >> 1;
if (get_max(mid, B).fi < m2.fi) hi = mid;
else lo = mid;
}
A = get_max(hi, B).se;
if (nex[A] >= C) {
A = nex[A];
return 1;
}
int ans = 0;
for (int i = 19; i >= 0; i--)
if (h[f[i][A]] <= m.fi) {
ans += (1<<i);
A = f[i][A];
}
if (A != m.se) {
if (h[f[0][A]] <= m2.fi) {
A = f[0][A];
++ans;
}
}
for (int i = 19; i >= 0; i--)
if (gojo[i][A] < C) {
ans += (1<<i);
A = gojo[i][A];
}
if (A < C) {
++ans;
A = nex[A];
}
return (C <= A and A <= D ? ans : -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... |
# | 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... |