Submission #1236317

#TimeUsernameProblemLanguageResultExecution timeMemory
1236317AMel0nRainforest Jumps (APIO21_jumps)C++20
37 / 100
4041 ms17556 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
#define FOR(i,N) for(ll i = 0; i < N; i++)
#define all(x) (x).begin(), (x).end()
#define F first
#define S second

#include "jumps.h"
int N;
vector<int> H;
vector<vector<int>> g;

bool sub1 = true;

void init(int N, std::vector<int> H) {
    ::N = N;
    ::H = H;
    g.resize(N);

    stack<int> stk;
    FOR(i, N) {
        while(stk.size() && H[stk.top()] <= H[i]) stk.pop();
        if (stk.size()) g[i].push_back(stk.top());
        stk.push(i);
    }
    while(stk.size()) stk.pop();
    for(int i = N-1; i >= 0; i--) {
        while(stk.size() && H[stk.top()] <= H[i]) stk.pop();
        if (stk.size()) g[i].push_back(stk.top());
        stk.push(i);
    }

    FOR(i, N-1) if (H[i] >= H[i+1]) sub1 = false;
}

int minimum_jumps(int A, int B, int C, int D) {
    if (sub1) return C-B;

    priority_queue<pair<int,int>, vector<pair<int,int>>, greater<pair<int,int>> > pq;
    vector<int> vis(N, 1e9);
    for(int i = A; i <= B; i++) {
        pq.push({0, i});
        vis[i] = 0;
    }

    while(pq.size()) {
        int d = pq.top().F;
        int u = pq.top().S;
        pq.pop();

        if (vis[u] != d) continue;

        for(int v: g[u]) {
            if (vis[v] > d+1) {
                pq.push({d+1, v});
                vis[v] = d+1;
            }
        }
    }

    int res = 1e9;
    for(int i = C; i <= D; i++) {
        res = min(res, vis[i]);
    }
    return (res == 1e9) ? -1 : res;
}
#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...