Submission #1196834

#TimeUsernameProblemLanguageResultExecution timeMemory
1196834GoBananas69Rainforest Jumps (APIO21_jumps)C++20
37 / 100
4043 ms13716 KiB
#include <cassert>
#include <cstdio>
#include <queue>
#include <vector>
#include <iostream>
#include "jumps.h"
using namespace std;
vector<vector<int>> adj;
bool subtask1 = true;
void init(int n, vector<int> h) {
    adj.resize(n);
    vector<int> q;
    for (int i = 0; i < n; ++i) {
        if (h[i] != i + 1) subtask1 = false;
        while (!q.empty() && h[q.back()] < h[i]) {
            q.pop_back();
        }
        if (!q.empty()) {
            adj[i].push_back(q.back());
        }
        q.push_back(i);
    }
    q.clear();
    for (int i = n - 1; i>=0; --i) {
        while (!q.empty() && h[q.back()] < h[i]) {
            q.pop_back();
        }
        if (!q.empty()) {
            adj[i].push_back(q.back());
        }
        q.push_back(i);
    }
}

int minimum_jumps(int A, int B, int C, int D) {
    if (subtask1) {
        return C - B;
    }
    queue<int> q;
    int n = adj.size();
    vector<int> dist(n, -1);
    for (int i = A; i <= B; ++i) {
        q.push(i);
        dist[i] = 0;
    }
    while (!q.empty()) {
        int u = q.front();
        q.pop();
        for (int &v : adj[u]) {
            if (C <= v && v <= D) return dist[u] + 1;
            if (dist[v] != -1) continue;
            dist[v] = dist[u] + 1;
            q.push(v);
        }
    }
    
    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...