Submission #1354552

#TimeUsernameProblemLanguageResultExecution timeMemory
1354552jumpRainforest Jumps (APIO21_jumps)C++20
33 / 100
4093 ms25772 KiB
#include "jumps.h"
#include <bits/stdc++.h>
int NG;
std::vector<int> adj[200010];
std::vector<int> rev[200010];
std::vector<bool> visit;
std::vector<int> dist;
void init(int N, std::vector<int> H) {
  NG=N;
  std::stack<int> st;
  int start=0,max=0;
  for(int i=0;i<N;i++){
    if(H[i]>max)start=i,max=H[i];
    while(!st.empty()&&H[st.top()]<H[i])st.pop();
    if(!st.empty())adj[i].push_back(st.top()),rev[st.top()].push_back(i);
    st.push(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())adj[i].push_back(st.top()),rev[st.top()].push_back(i);
    st.push(i);
  }
}
int minimum_jumps(int A, int B, int C, int D) {
  //this is like.. very slow
  std::queue<int> q;
  dist.assign(NG,1e9);
  visit.assign(NG,false);
  for(int i=A;i<=B;i++)q.push(i),dist[i]=0,visit[i]=true;
  while(!q.empty()){
    int curr=q.front();q.pop();
    for(auto to:adj[curr]){
      if(visit[to])continue;
      visit[to]=true;
      dist[to]=dist[curr]+1;
      q.push(to);
    }
  }
  int min=1e9;
  for(int i=C;i<=D;i++)min=std::min(dist[i],min);
  if(min==1e9)min=-1;
  return min;
}
#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...