제출 #1199041

#제출 시각아이디문제언어결과실행 시간메모리
1199041origabai밀림 점프 (APIO21_jumps)C++20
0 / 100
71 ms33984 KiB
#include "jumps.h"
#include <bits/stdc++.h>
using namespace std;

int N;
vector<int> H;
int lg;
vector<vector<int>> out;
vector<vector<int>> mn,mx;

void init(int N2, std::vector<int> H2){
    N=N2;
    H=H2;
    stack<int> s;
    out.resize(N);
    for (int i=0;i<N;i++){
        while (s.size() && H[s.top()] < H[i]){
            out[s.top()].push_back(i);
            s.pop();
        }
        s.push(i);
    }
    for (int i=N-1;i>=0;i--){
        while (s.size() && H[s.top()] < H[i]){
            out[s.top()].push_back(i);
            s.pop();
        }
        s.push(i);
    }
    lg = log2(N) + 1;
    mx.resize(lg);
    mn.resize(lg);
    for (int i=0;i<lg;i++){
        mx[i].resize(N);
        mn[i].resize(N);
    }
    for (int i=0;i<N;i++){
        if (out[i].size() == 1){
            mx[0][i] = mn[0][i] = out[i][0];
        } else if (out[i].size() == 2){
            int a = out[i][0], b = out[i][1];
            if (H[a] > H[b]) swap(a,b);
            mn[0][i] = a;
            mx[0][i] = b;
        } else {
            mn[0][i] = mx[0][i] = i;
        }
    }
    for (int i=1;i<lg;i++){
        for (int j=0;j<N;j++){
            mx[i][j] = mx[i-1][mx[i-1][j]];
            mn[i][j] = mn[i-1][mn[i-1][j]];
        }
    }
}

int minimum_jumps(int A, int B, int C, int D) {
    int ans = 0;
    for (int k=lg-1;k>=0;k--){
        if (H[mx[k][A]] < H[C]){
            A = mx[k][A];
            ans += (1 << k);
        }
    }
    for (int k=lg-1;k>=0;k--){
        if (H[mn[k][A]] < H[C]){
            A = mn[k][A];
            ans += (1 << k);
        }
    }
    if (out[A][0] == C || out[A][1] == C){
        return ans+1;
    }
    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...