제출 #1334424

#제출 시각아이디문제언어결과실행 시간메모리
1334424boclobanchat밀림 점프 (APIO21_jumps)C++20
0 / 100
4009 ms68556 KiB
#include"jumps.h"
#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e5+5;
int L[MAXN],R[MAXN],sp[MAXN][20],A[MAXN],pos[MAXN],shiftr[MAXN][20];
pair<int,int> nex[MAXN][20];
int getlog(long long n) { return 63-__builtin_clzll(n); }
int rmq(int l,int r)
{
	int lg=getlog(r-l+1);
	return max(sp[l][lg],sp[r-(1<<lg)+1][lg]);
}
void init(int n,vector<int> H)
{
	for(int i=1;i<=n;i++) A[i]=H[i-1],pos[A[i]]=i;
	stack<int> st;
	for(int i=1;i<=n;i++)
	{
		while(!st.empty()&&H[i-1]>H[st.top()-1]) st.pop();
		if(st.empty()) L[i]=1;
		else L[i]=st.top();
		st.push(i);
	}
	while(!st.empty()) st.pop();
	for(int i=n;i;i--)
	{
		while(!st.empty()&&H[i-1]>H[st.top()-1]) st.pop();
		if(st.empty()) R[i]=n;
		else R[i]=st.top();
		st.push(i);
	}
	for(int i=1;i<=n;i++) sp[i][0]=A[i],nex[i][0]={L[i],R[i]},shiftr[i][0]=R[i];
	for(int j=1;j<=17;j++) for(int i=1;i<=n-(1<<j)+1;i++) sp[i][j]=max(sp[i][j-1],sp[i+(1<<(j-1))][j-1]);
	for(int j=1;j<=17;j++) for(int i=1;i<=n;i++)
	{
		shiftr[i][j]=shiftr[shiftr[i][j-1]][j-1];
		nex[i][j]=nex[pos[rmq(nex[i][j-1].first,nex[i][j-1].second)]][j-1];
	}
}
int minimum_jumps(int a,int b,int c,int d)
{
	a++,b++,c++,d++;
	int mx=rmq(c,d),l=1,r=d;
	for(int i=b;i>0;i--) if(A[i]>mx)
	{
		a=max(a,i+1),l=i+1;
		break;
	}
	if(a>b||(b+1<=c-1&&rmq(b+1,c-1)>mx)) return -1;
	int pl=a,pr=b,ans=0;
	for(int i=17;i+1;i--)
	{
		int p=pos[rmq(pl,pr)],u=nex[p][i].first,v=nex[p][i].second;
		if(u>=l&&v<c) pl=u,pr=v,ans+=(1<<i);
	}
	if(R[rmq(pl,pr)]>=c) return ans+1;
	pr=R[rmq(pl,pr)],pl=l;
	for(int i=17;i+1;i--) if(shiftr[pos[rmq(pl,pr)]][i]<c) pr=shiftr[pos[rmq(pl,pr)]][i],ans+=(1<<i);
	return ans+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...