# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
711626 | irmuun | Rainforest Jumps (APIO21_jumps) | C++17 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
#include "jumps.h"
using namespace std;
#define pb push_back
#define ll long long
#define ff first
#define ss second
#define PI 3.1415926535897932384626433
#define all(s) s.begin(),s.end()
const int maxn=200000,INF=1e9;
bool ok=true;
vector<int>adj[maxn+5];
int n,used[maxn+5],dist[maxn+5];
int dfs(int a,int b,int c,int d){
queue<int>q;
fill(used,used+n+1,0);
fill(dist,dist+n+1,0);
for(int i=a;i<=b;i++) q.push(i);
while(!q.empty()){
int x=q.front();
q.pop();
if(c<=x&&x<=d) return dist[x];
for(auto u:adj[x]){
if(dist[u]==INF){
dist[u]=dist[x]+1;
q.push(u);
}
}
}
return -1;
}
void init(int N,vector<int>H){
n=N;
for(int i=0;i<n;i++){
if(H[i]!=i+1) ok=false;
}
stack<pair<int,int>>s;
for(int i=0;i<n;i++){
while(!s.empty()&&s[i].ff<H[i]) s.pop();
if(!s.empty()) adj[i].pb(s.top().ss);
s.push({H[i],i});
}
while(!s.empty()) s.pop();
for(int i=n-1;i>=0;i--){
while(!s.empty()&&s[i].ff<H[i]) s.pop();
if(!s.empty()) adj[i].pb(s.top().ss);
s.push({H[i],i});
}
}
int minimum_jumps(int A, int B, int C, int D){
if(ok==true){
return C-B;
}
return dfs(A,B,C,D);
}