Submission #1187244

#TimeUsernameProblemLanguageResultExecution timeMemory
1187244AvianshRainforest Jumps (APIO21_jumps)C++20
33 / 100
4030 ms28904 KiB
#include "jumps.h"

#include <bits/stdc++.h>

using namespace std;

const int maxn = 2e5;
int h[maxn];
vector<int>g[maxn];
int rev[maxn];
int n;

void init(int N, vector<int> H) {
    n=N;
    for(int i = 0;i<n;i++){
        h[i]=H[i];
        rev[h[i]-1]=i;
    }
    set<int>inds;
    for(int i = n-1;i>=0;i--){
        int ind = rev[i];
        if(inds.size()){
            auto it = inds.lower_bound(rev[i]);
            if(it!=inds.end()){
                g[ind].push_back(*it);
            }
            if(it!=inds.begin()){
                it--;
                g[ind].push_back(*it);
            }
        }
        inds.insert(rev[i]);
    }
}

int minimum_jumps(int a, int b, int c, int d) {
    int ans = 1e9;
    priority_queue<array<int,2>,vector<array<int,2>>,greater<array<int,2>>>pq;
    for(int i = a;i<=b;i++){
        pq.push({0,i});
    }
    int dist[n];
    fill(dist,dist+n,1e9);
    while(!pq.empty()){
        array<int,2>curr = pq.top();
        pq.pop();
        if(dist[curr[1]]<=curr[0])
            continue;
        dist[curr[1]]=curr[0];
        for(int i:g[curr[1]]){
            pq.push({curr[0]+1,i});
        }
    }
    for(int i = c;i<=d;i++){
        ans=min(ans,dist[i]);
    }
    if(ans==1e9)
        return -1;
    return ans;
}
#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...