#include "jumps.h"
#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
#include <set>
#include <unordered_set>
#include <queue>
#include <deque>
#include <string>
#include <sstream>
#include <iomanip>
#include <map>
#include <unordered_map>
#include <stack>
#include <cstdio>
#include <climits>
#include <tuple>
#include <ctime>
#include <cstring>
#include <numeric>
#include <functional>
#include <chrono>
#include <cassert>
#include <bitset>
#include <fstream>
//#include <bit>
//#include <ranges>
//#include <numbers>
#define sz(a) ((int)((a).size()))
// printf("%.10f\n", ans);
/*ofstream fout("timeline.out");
ifstream fin("timeline.in");*/
using ll = long long;
using namespace std;
const int inf = 1e9;
bool task1;
int n, a, b, c, d, ans;
vector<int> h, dp, nge, pge, ind;
vector<vector<int>> go1, go2;
bool task(int id)
{
if (id == 1)
{
for (int i = 0; i < n; i++) if (h[i] != i + 1) return 0;
return 1;
}
return 0;
}
void NGE()
{
stack<int> s;
s.push(0);
for (int i = 1; i < n; i++)
{
if (s.empty())
{
s.push(i);
continue;
}
while (!s.empty() && h[s.top()] < h[i])
{
nge[s.top()] = i;
s.pop();
}
s.push(i);
}
while (!s.empty())
{
nge[s.top()] = -1;
s.pop();
}
}
void PGE()
{
stack<int> s;
s.push(0);
pge[0] = -1;
for (int i = 1; i < n; i++)
{
while (!s.empty() && h[s.top()] < h[i]) s.pop();
if (s.empty()) pge[i] = -1;
else pge[i] = s.top();
s.push(i);
}
}
int dfs(int u)
{
if (dp[u] != inf + 1) return dp[u];
if (c <= u && u <= d) return dp[u] = 0;
int r = nge[u];
int ans = inf;
if (r != -1) ans = min(ans, dfs(r) + 1);
int l = pge[u];
if (l != -1) ans = min(ans, dfs(l) + 1);
return dp[u] = ans;
}
void init(int N, std::vector<int> H) {
n = N;
h = H;
nge = pge = vector<int>(n);
ind = vector<int>(n + 1);
go1 = go2 = vector<vector<int>>(n, vector<int>(20));
NGE();
PGE();
if (task(1)) task1 = 1;
for (int i = 0; i < n; i++) ind[h[i]] = i;
for (int i = n; i >= 1; i--)
{
int id = ind[i];
int l = pge[id], r = nge[id];
if (l == -1 || r == -1) go1[id][0] = n;
else
{
if (h[l] > h[r]) go1[id][0] = l;
else go1[id][0] = r;
}
for (int j = 1; j < 20; j++)
{
int u = go1[id][j - 1];
if (u == n) go1[id][j] = n;
else go1[id][j] = go1[u][j - 1];
}
if (l == -1 && r == -1) go2[id][0] = n;
else if (l == -1) go2[id][0] = r;
else if (r == -1) go2[id][0] = l;
else
{
if (h[l] < h[r]) go2[id][0] = l;
else go2[id][0] = r;
}
for (int j = 1; j < 20; j++)
{
int u = go2[id][j - 1];
if (u == n) go2[id][j] = n;
else go2[id][j] = go2[u][j - 1];
}
}
}
int minimum_jumps(int A, int B, int C, int D) {
a = A, b = B, c = C, d = D;
if (task1) return c - b;
if (a == b && c == d)
{
if (h[a] > h[c]) return -1;
int ans = 0, id = a;
for (int i = 19; i >= 0; i--)
{
int u = go1[id][i];
if (u < n && h[u] <= h[c])
{
ans += (1 << i);
id = u;
}
}
for (int i = 19; i >= 0; i--)
{
int u = go2[id][i];
if (u < n && h[u] > h[c]) return -1;
if (u < n && h[u] <= h[c])
{
ans += (1 << i);
id = u;
}
}
return ans;
}
else
{
dp = vector<int>(n, inf + 1);
ans = inf;
for (int i = a; i <= b; i++) ans = min(ans, dfs(i));
if (ans == inf) ans = -1;
return ans;
}
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
208 KB |
Output is correct |
2 |
Correct |
0 ms |
208 KB |
Output is correct |
3 |
Correct |
159 ms |
41372 KB |
Output is correct |
4 |
Correct |
947 ms |
51960 KB |
Output is correct |
5 |
Correct |
615 ms |
26420 KB |
Output is correct |
6 |
Correct |
802 ms |
51884 KB |
Output is correct |
7 |
Correct |
674 ms |
35520 KB |
Output is correct |
8 |
Correct |
803 ms |
51868 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
208 KB |
Output is correct |
2 |
Correct |
0 ms |
208 KB |
Output is correct |
3 |
Correct |
0 ms |
208 KB |
Output is correct |
4 |
Correct |
0 ms |
208 KB |
Output is correct |
5 |
Incorrect |
2 ms |
208 KB |
Output isn't correct |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
208 KB |
Output is correct |
2 |
Correct |
0 ms |
208 KB |
Output is correct |
3 |
Correct |
0 ms |
208 KB |
Output is correct |
4 |
Correct |
0 ms |
208 KB |
Output is correct |
5 |
Incorrect |
2 ms |
208 KB |
Output isn't correct |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
208 KB |
Output is correct |
2 |
Correct |
0 ms |
208 KB |
Output is correct |
3 |
Correct |
0 ms |
208 KB |
Output is correct |
4 |
Correct |
0 ms |
208 KB |
Output is correct |
5 |
Correct |
204 ms |
41864 KB |
Output is correct |
6 |
Correct |
257 ms |
52844 KB |
Output is correct |
7 |
Correct |
110 ms |
26740 KB |
Output is correct |
8 |
Correct |
285 ms |
52716 KB |
Output is correct |
9 |
Correct |
22 ms |
8216 KB |
Output is correct |
10 |
Correct |
262 ms |
52748 KB |
Output is correct |
11 |
Correct |
94 ms |
51864 KB |
Output is correct |
12 |
Correct |
105 ms |
55784 KB |
Output is correct |
13 |
Correct |
98 ms |
55320 KB |
Output is correct |
14 |
Correct |
202 ms |
52636 KB |
Output is correct |
15 |
Correct |
181 ms |
54944 KB |
Output is correct |
16 |
Correct |
115 ms |
53688 KB |
Output is correct |
17 |
Correct |
136 ms |
54024 KB |
Output is correct |
18 |
Correct |
0 ms |
208 KB |
Output is correct |
19 |
Correct |
0 ms |
336 KB |
Output is correct |
20 |
Correct |
0 ms |
336 KB |
Output is correct |
21 |
Correct |
1 ms |
352 KB |
Output is correct |
22 |
Correct |
0 ms |
336 KB |
Output is correct |
23 |
Correct |
0 ms |
336 KB |
Output is correct |
24 |
Correct |
1 ms |
336 KB |
Output is correct |
25 |
Correct |
0 ms |
336 KB |
Output is correct |
26 |
Correct |
1 ms |
464 KB |
Output is correct |
27 |
Correct |
2 ms |
720 KB |
Output is correct |
28 |
Correct |
1 ms |
848 KB |
Output is correct |
29 |
Correct |
2 ms |
720 KB |
Output is correct |
30 |
Correct |
1 ms |
848 KB |
Output is correct |
31 |
Correct |
1 ms |
720 KB |
Output is correct |
32 |
Correct |
0 ms |
208 KB |
Output is correct |
33 |
Correct |
253 ms |
51864 KB |
Output is correct |
34 |
Correct |
292 ms |
52736 KB |
Output is correct |
35 |
Correct |
96 ms |
55696 KB |
Output is correct |
36 |
Correct |
205 ms |
52716 KB |
Output is correct |
37 |
Correct |
164 ms |
55840 KB |
Output is correct |
38 |
Correct |
104 ms |
55352 KB |
Output is correct |
39 |
Correct |
0 ms |
208 KB |
Output is correct |
40 |
Correct |
125 ms |
30216 KB |
Output is correct |
41 |
Correct |
270 ms |
52016 KB |
Output is correct |
42 |
Incorrect |
88 ms |
51964 KB |
Output isn't correct |
43 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
208 KB |
Output is correct |
2 |
Correct |
0 ms |
208 KB |
Output is correct |
3 |
Correct |
0 ms |
208 KB |
Output is correct |
4 |
Incorrect |
274 ms |
23808 KB |
Output isn't correct |
5 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
208 KB |
Output is correct |
2 |
Correct |
0 ms |
208 KB |
Output is correct |
3 |
Correct |
0 ms |
208 KB |
Output is correct |
4 |
Incorrect |
274 ms |
23808 KB |
Output isn't correct |
5 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
208 KB |
Output is correct |
2 |
Correct |
0 ms |
208 KB |
Output is correct |
3 |
Correct |
159 ms |
41372 KB |
Output is correct |
4 |
Correct |
947 ms |
51960 KB |
Output is correct |
5 |
Correct |
615 ms |
26420 KB |
Output is correct |
6 |
Correct |
802 ms |
51884 KB |
Output is correct |
7 |
Correct |
674 ms |
35520 KB |
Output is correct |
8 |
Correct |
803 ms |
51868 KB |
Output is correct |
9 |
Correct |
0 ms |
208 KB |
Output is correct |
10 |
Correct |
0 ms |
208 KB |
Output is correct |
11 |
Correct |
0 ms |
208 KB |
Output is correct |
12 |
Correct |
0 ms |
208 KB |
Output is correct |
13 |
Incorrect |
2 ms |
208 KB |
Output isn't correct |
14 |
Halted |
0 ms |
0 KB |
- |