Submission #413377

#TimeUsernameProblemLanguageResultExecution timeMemory
413377keta_tsimakuridzeRainforest Jumps (APIO21_jumps)C++14
48 / 100
1540 ms49436 KiB
#include <bits/stdc++.h>
#define f first
#define s second
#define pii pair<int,int>
 
using namespace std;
const int N = 2e5+5;
int r[N],l[N],n,dist[N],F,ans,aft[2][N][20],Lg,a[N],tree[4*N],idx[N];
vector<int>V[N];
void build(int u,int l,int r){
	if(l==r) {
		tree[u] = a[l];
		return;
	}
	int mid=(l+r)/2;
	build(2*u,l,mid);
	build(2*u+1,mid+1,r);
	tree[u] = max(tree[2*u],tree[2*u+1]);
}
int getans(int u,int start,int end,int l,int r){
	if(l>end || r<start) return 0;
	if(start<=l && r<=end) return tree[u];
	int mid = (l+r)/2;
	return max(getans(2*u,start,end,l,mid),getans(2*u+1,start,end,mid+1,r));
}
void init(int NN, std::vector<int> H) {
	n=NN;
	for(int i=0;i<n;i++){
		aft[0][i][0] = -1;
		aft[1][i][0] = -1;
		a[i]=H[i];
		idx[a[i]] = i;
		int x = i-1;
		if(H[i]!=i+1) F=1;
		while(x>=0 && H[x]<=H[i]) x = l[x];
		l[i] = x;
		if(x>=0) V[i].push_back(x);
	}
	build(1,0,n-1);
	for(int i=n-1;i>=0;i--){
		int x = i+1;
		while(x<n && H[x]<H[i]) x = r[x];
		r[i] = x;
		if(x<n) V[i].push_back(x);
		if(r[i]<n && l[i]>=0) {
			aft[1][i][0] = r[i];
			aft[0][i][0] = l[i];
			if(H[r[i]] < H[l[i]]) swap(aft[1][i][0],aft[0][i][0]);
		}
		else if(r[i]<n) {
			aft[1][i][0] = r[i];
		}
		else if(l[i]>=0){
			aft[1][i][0] = l[i];
		}
	//	cout<<i<<"__"<<aft[0][i][0]<<" "<<aft[1][i][0]<<endl;
	}
	Lg = log2(n)+1;
	for(int f=0;f<2;f++){
		for(int j=1;j<=Lg;j++)
		for(int i=0;i<n;i++) {
			if(aft[f][i][j-1]==-1) aft[f][i][j] = -1;
			else aft[f][i][j]=aft[f][aft[f][i][j-1]][j-1];
		}
	}
}
int Up(int u,int f,int b,int c,int d){ 
	for(int i=Lg;i>=0;i--){
		if(u>=c && u<=d) return u;
		if(aft[f][u][i]!=-1 && a[aft[f][u][i]] <= b ) ans += (1<<i),u=aft[f][u][i];
	}
	return u;
}
int minimum_jumps(int A, int B, int C, int D) {
	if(!F) {
		if(A>D ) return -1;
		if(B<=C) return C-B;
		return 0;
	}
	else { int c=C,d=D;
	if(!(B<C || D<A)) return 0;
		C  = idx[getans(1,C,D,0,n-1)];
		D = C;
		ans = 0;
		if(A<=C && C<=B) return 0;
		if(B<C) {
			if(l[D] >= B) return -1;
			A = getans(1,max(A,l[D]+1),B,0,n-1);
		}
		else  {
			if(r[D] <= A) return -1;
			A= getans(1,A,min(B,r[D]-1),0,n-1);
		}
		A = idx[A];
	//	cout<<ans<<endl;
	int x = Up(Up(A,1,a[C],c,d),0,a[C],c,d) ;
		if(x>=c && x<=d) return ans;
		return -1;
	}
 
}
#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...