Submission #1291936

#TimeUsernameProblemLanguageResultExecution timeMemory
1291936Hamed_GhaffariRainforest Jumps (APIO21_jumps)C++20
33 / 100
4083 ms4316 KiB
#include "jumps.h"
#include <bits/stdc++.h>
using namespace std;

#define maxs(a, b) (a = max(a, b))

const int MXN = 2e5+5;

int n, a[MXN], L[MXN], R[MXN];

void init(int N, vector<int> H) {
    n = N;
    a[0] = a[n+1] = 1e9;
    for(int i=1; i<=n; i++) {
        a[i] = H[i-1];
        for(L[i]=i-1; a[L[i]]<=a[i]; L[i]=L[L[i]]);
    }
    for(int i=n; i>=1; i--)
        for(R[i]=i+1; a[R[i]]<=a[i]; R[i]=R[R[i]]);
}

int minimum_jumps(int A, int B, int C, int D)  {
    A++; B++; C++; D++;
    int mx1=0, mx2=0;
    for(int i=B; i<C; i++) maxs(mx1, a[i]);
    for(int i=C; i<=D; i++) maxs(mx2, a[i]);
    if(mx1>mx2) return -1;
    int lst=B, v=B;
    for(int i=B-1; i>=A; i--)
        if(a[i]>a[lst]) {
            lst = i;
            if(a[i]<mx2) v = i;
        }
    int ans = 0;
    while(1) {
        ans++;
        if(R[v]>=C) break;
        if(a[L[v]]>mx2) v = R[v];
        else if(a[L[v]]>a[R[v]]) v = L[v];
        else v = R[v];
    }
    return ans;
}
#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...