제출 #1199731

#제출 시각아이디문제언어결과실행 시간메모리
1199731adiyer밀림 점프 (APIO21_jumps)C++20
4 / 100
513 ms50560 KiB
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 2e5 + 11;

int n;
int a[MAXN];
int l[MAXN][20], r[MAXN][20], mx[MAXN][20];

stack < int > s;

void init(int N, std::vector<int> H) {
    n = N;
    for(int i = 0; i < n; i++) a[i] = H[i];
    for(int i = 0; i < n; i++){
        while(s.size() && a[s.top()] < a[i]) s.pop();
        l[i][0] = (s.empty() ? i : s.top()), s.push(i);
    }    
    for(int i = n - 1; i >= 0; i--){
        while(s.size() && a[s.top()] < a[i]) s.pop();
        r[i][0] = (s.empty() ? i : s.top()), s.push(i);
    }
    for(int i = 0; i < n; i++) mx[i][0] = (a[l[i][0]] > a[r[i][0]] ? l[i][0] : r[i][0]);
    for(int k = 1; k < 20; k++)
        for(int i = 0; i < n; i++)
            l[i][k] = l[l[i][k - 1]][k - 1], r[i][k] = r[r[i][k - 1]][k - 1], mx[i][k] = mx[mx[i][k - 1]][k - 1];
}

int minimum_jumps(int A, int B, int C, int D) {
    if(r[B][0] > D) return -1;
    if(r[B][0] >= C) return 1;
    int p = B;
    for(int i = 19; i >= 0; i--)
        if(r[p][i] < C)
            p = r[p][i];
    if(r[p][0] > D) return -1;
    int s = B, ans = 0, res = n + 1;
    for(int i = 19; i >= 0; i--)
        if(a[l[s][i]] < a[p] && l[s][i] >= A)
            s = l[s][i];
    for(int i = 19; i >= 0; i--)
        if(a[mx[s][i]] < a[p])
            s = mx[s][i], ans |= (1 << i);
    if(a[l[s][0]] > a[p] && r[l[s][0]][0] <= D) res = ans + 2;
    if(r[s][0] == p) ans += 2;
    return min(ans, res);
}

#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...