Submission #1360225

#TimeUsernameProblemLanguageResultExecution timeMemory
1360225Jawad_Akbar_JJRainforest Jumps (APIO21_jumps)C++17
77 / 100
4043 ms53148 KiB
#include <iostream>
#include <vector>

using namespace std;
const int N = 1<<18;
int nxt[N][20], Nxt[N][20], Mx[N][20], lft[N], rgt[N];
vector<int> A, v;

void init(int n, vector<int> B){
	A = B;
	A.push_back(n + 1);
	for (int i=0;i<=n;i++){
		while (v.size() > 0 and A[v.back()] < A[i])
			rgt[v.back()] = i, v.pop_back();
		v.push_back(i), rgt[i] = n;
	}

	v = {};
	for (int i=n;i>=0;i--){
		while (v.size() > 0 and A[v.back()] < A[i])
			lft[v.back()] = i, v.pop_back();
		v.push_back(i), lft[i] = n;
	}

	for (int i=0;i<=n;i++){
		Nxt[i][0] = rgt[i];
		if (A[lft[i]] > A[rgt[i]])
			Nxt[i][0] = lft[i];
		nxt[i][0] = rgt[i];
		if (lft[i] == n)
			lft[i] = -1;
	}

	for (int j=0;j<18;j++){
		for (int i=0;i<=n;i++){
			nxt[i][j+1] = nxt[nxt[i][j]][j];
			Nxt[i][j+1] = Nxt[Nxt[i][j]][j];
		}
	}

	for (int i=n;i>=0;i--){
		Mx[i][0] = i;
		for (int j=0;j<18;j++){
			if (i + (1<<j) < n)
				Mx[i][j+1] = (A[Mx[i][j]] > A[Mx[i+(1<<j)][j]] ? Mx[i][j] : Mx[i + (1<<j)][j]);
			else
				Mx[i][j+1] = Mx[i][j];
		}
	}
}

int getMx(int l, int r){
	// cout<<l<<' '<<r<<endl;
	int b = 31 - __builtin_clz(r - l + 1);
	return (A[Mx[l][b]] > A[Mx[r - (1<<b) + 1][b]] ? Mx[l][b] : Mx[r - (1<<b) + 1][b]);
}

int minimum_jumps(int a, int b, int c, int d){
	int Ans = -1;
	for (int i=c;i<=d;i++){
		// cout<<i<<endl;
		if (lft[i] >= b and lft[i] != A.size() - 1)
			continue;

		int M = getMx(max(a, lft[i]+1), b), ans = 0;
		// cout<<M<<endl;
		for (int j=18;j+1;j--){
			if (A[Nxt[M][j]] <= A[i])
				M = Nxt[M][j], ans += (1<<j);
		}
		// cout<<M<<endl;
		for (int j=18;j+1;j--){
			if (A[nxt[M][j]] <= A[i])
				M = nxt[M][j], ans += (1<<j);
		}
		// cout<<M<<endl;
		if (Ans == -1 or Ans > ans)
			Ans = ans;
	}
	return Ans;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...