Submission #1336157

#TimeUsernameProblemLanguageResultExecution timeMemory
1336157vehamRainforest Jumps (APIO21_jumps)C++20
0 / 100
108 ms36592 KiB
#include "jumps.h"
#include <bits/stdc++.h>
using namespace std;
typedef vector<int> vi;
typedef vector<vi> vvi;

struct solve{
  int N;
  vi H,Hinv;
  vvi BL,BR;

  solve(){}
  solve(int N, vi H2) : N(N) {
    map<int,int> mh;
    for(int i = 0;i < N;i++) mh[H2[i]] = i;
    H.assign(N,0);
    Hinv = H;
    for(int i = 0; auto [k,v] : mh){
      H[v] = i;
      Hinv[i] = v;
      i++;
    }

    stack<int> st;
    BL.assign(int(ceil(log2(N) + 2)),vi(N,-1));
    BR = BL;
    
    for(int i = 0;i < N;i++){
      while(!st.empty() && H[st.top()] < H[i]) st.pop();
      if(!st.empty()) BL[0][i] = st.top();
      st.push(i);
    }
    st = {};
    for(int i = N-1;i >= 0;i--){
      while(!st.empty() && H[st.top()] < H[i]) st.pop();
      if(!st.empty()) BR[0][i] = st.top();
      st.push(i);
    }

    for(int p = 1;p < BL.size();p++){
      for(int i = 0;i < N;i++){
        if(BL[p-1][i] > BR[p-1][i]){
          BL[p][i] = BL[p-1][BL[p-1][i]];
          BR[p][i] = BR[p-1][BL[p-1][i]];
        }
        if(BL[p-1][i] < BR[p-1][i]){
          BL[p][i] = BL[p-1][BR[p-1][i]];
          BR[p][i] = BR[p-1][BR[p-1][i]];
        }
      }
    }
  }

  int try_s(int S, int C, int D) {
    int ans = 0;
    int pos = S;
    for(int p = BL.size() - 1;p >= 0;p--) {
      if(BR[p][pos] == -1 || BR[p][pos] > D) continue;
      ans += (1 << p);
      pos = BR[p][pos];
      if(pos >= C) break;
    }
    if(pos >= C) return ans;
    return -1;
  }

  int query(int A, int B, int C, int D) {
    int S = B;
    int best = try_s(S,C,D);
    int curr;
    if(best == -1) return -1;
    for(int p = BL.size()-1;p >= 0;p--) {
      if(BL[p][S] < A) continue;
      curr = try_s(BL[p][S],C,D);
      if(curr > best) S = BL[p][S], best = curr;
    }
    return best;
  }
};

solve So;
void init(int N, vi H) {
  So = solve(N,H);
}

int minimum_jumps(int A, int B, int C, int D) {
  return So.query(A,B,C,D);
}
#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...