Submission #1357656

#TimeUsernameProblemLanguageResultExecution timeMemory
1357656basicRainforest Jumps (APIO21_jumps)C++20
4 / 100
321 ms51476 KiB
#include <bits/stdc++.h>
using namespace std;
int n, l[202020][20], r[202020][20], p[202020][20], x, y, t;
vector<int> h, st;
void init(int N, vector<int> H) {
	n = N, h = H, h.push_back(0);
	for (int i = 0; i < n; l[i][0] = st.size() ? st.back() : n, st.push_back(i++))
		for (; st.size() && h[st.back()] < h[i]; st.pop_back())
			;
	st = {};
	for (int i = n; i--; p[i][0] = h[l[i][0]] > h[r[i][0] = st.size() ? st.back() : n] ? l[i][0] : r[i][0], st.push_back(i))
		for (; st.size() && h[st.back()] < h[i]; st.pop_back())
			;
	l[n][0] = r[n][0] = p[n][0] = n, h.back() = 1e9;
	for (int k = 1; k < 20; k++)
		for (int i = 0; i <= n; i++)
			p[i][k] = p[p[i][k - 1]][k - 1], l[i][k] = l[l[i][k - 1]][k - 1], r[i][k] = r[r[i][k - 1]][k - 1];
}
int minimum_jumps(int A, int B, int C, int D) {
	x = y = B;
	for (int k = 20; k--;)
		if (r[x][k] < C)
			x = r[x][k];
	if (r[x][0] > D)
		return -1;
	for (int k = 20; k--;)
		if (l[y][k] >= A && h[l[y][k]] < h[x])
			y = l[y][k];
	if (r[l[y][0]][0] >= C && r[l[y][0]][0] <= D)
		return 1 + (l[y][0] < A);
	x = r[x][t = 0];
	for (int k = 20; k--;)
		if (h[p[y][k]] < h[x])
			y = p[y][k], t += 1 << k;
	for (int k = 20; k--;)
		if (r[y][k] <= x)
			y = r[y][k], t += 1 << k;
	return t;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...