Submission #1355870

#TimeUsernameProblemLanguageResultExecution timeMemory
1355870NewtonabcRainforest Jumps (APIO21_jumps)C++20
4 / 100
367 ms83428 KiB
#include "jumps.h"

#include <vector>
#include<bits/stdc++.h>
using namespace std;
const int M=2e5+10;
int dl[M][20],dh[M][20],g[M][20],gmx[M][20],jr[M][20];
vector<int> tH;
int nl[M],nr[M],n;
int fmx(int l,int r){
    if(l>r) return INT_MIN;
    int now=l;
    int mx=INT_MIN;
    for(int i=19;i>=0;i--){
        if(now+(1<<i)<=r+1) mx=max(mx,gmx[now][i]),now+=(1<<i),now=min(now,n-1);
    }
    return mx;
}
void init(int N, std::vector<int> H) {
    stack<int> st;
    n=N;
    for(int i=0;i<N;i++) nl[i]=nr[i]=N;
    for(int i=0;i<N;i++){
        while(!st.empty() && H[st.top()]<H[i]) st.pop();
        if(!st.empty()) nl[i]=st.top(),g[i][0]=st.top();
        else g[i][0]=N;
        st.push(i);
        gmx[i][0]=H[i];
    }
    while(!st.empty()) st.pop();
    for(int i=N-1;i>=0;i--){
        while(!st.empty() && H[st.top()]<H[i]) st.pop();
        if(!st.empty()) nr[i]=st.top(),jr[i][0]=st.top();
        else jr[i][0]=N;
        st.push(i);
    }
    dl[N][0]=dh[N][0]=g[N][0]=jr[N][0]=N;
    H.push_back(INT_MAX);
    tH=H;
    for(int i=0;i<N;i++){
        if(H[nl[i]]<H[nr[i]]) dl[i][0]=nl[i],dh[i][0]=nr[i];
        else dl[i][0]=nr[i],dh[i][0]=nl[i];
    }
    for(int i=1;i<20;i++) for(int j=0;j<=N;j++){
        dl[j][i]=dl[dl[j][i-1]][i-1];
        dh[j][i]=dh[dh[j][i-1]][i-1];
        g[j][i]=g[g[j][i-1]][i-1];
        gmx[j][i]=max(gmx[j][i-1],gmx[min(N-1,j+(1<<(i-1)))][i-1]);
        jr[j][i]=jr[jr[j][i-1]][i-1];
    }
}
int minimum_jumps(int A, int B, int C, int D) {
    int now=B;
    int bd=fmx(C,D);
    for(int i=19;i>=0;i--){
        int cd=g[now][i];
        if(cd<A) continue;
        if(cd==n) continue;
        if(tH[cd]<bd && fmx(cd+1,C-1)<bd) now=cd;
    }
    int cp=now;
    if(tH[now]>bd || fmx(now+1,C-1)>bd) return -1;
    int ret=0;
    //cout<<"START" <<now <<"\n";
    for(int i=19;i>=0;i--){
        int cd=dh[now][i];
        if(cd==n) continue;
        if(cd>D) continue;
        if(cd<C && tH[cd]<=bd && fmx(cd+1,D)<=bd && jr[cd][0]<C){
            now=cd,ret+=(1<<i);
        }
    }
    if(C<=dh[now][0] && dh[now][0]<=D) return ret+1;
    //<<now <<" " <<ret <<"\n";
    for(int i=19;i>=0;i--){
        int cd=jr[now][i];
        if(cd==n) continue;
        if(jr[now][i]<C) now=cd,ret+=(1<<i);
    }
    if(C<=now && now<=D) return ret;
    ret++;
    return ret;
}
#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...