제출 #1359228

#제출 시각아이디문제언어결과실행 시간메모리
1359228ray1457밀림 점프 (APIO21_jumps)C++20
33 / 100
4094 ms15264 KiB
#include <bits/stdc++.h>
#include "jumps.h"
using namespace std;
using ll = long long;

// #define int ll
#define pii pair<int,int>
#define vi vector<int>
#define ff first
#define ss second
#define all(x) x.begin(), x.end()
#define pb push_back

const int INF = 1e9;
const int MOD = 1e9 + 7;

vector<vi> adj;
int N;

void init(int n, std::vector<int> a) {
    N = n;
    adj.assign(n, vi());
    vi nxt(n, -1), prev(n, -1);
    stack<int> s;
    for (int i = 0; i<n; i++) {
        while (!s.empty() && a[s.top()] < a[i]) {
            s.pop();
        }

        if (!s.empty()) prev[i] = s.top();
        s.push(i);
    }

    while (!s.empty()) s.pop();

    for (int i = n-1; i>=0; i--) {
        while (!s.empty() && a[s.top()] < a[i]) {
            s.pop();
        }

        if (!s.empty()) nxt[i] = s.top();
        s.push(i);
    }

    for (int i = 0; i<n; i++) {
        if (nxt[i] != -1) adj[i].pb(nxt[i]);
        if (prev[i] != -1) adj[i].pb(prev[i]);
    }

}

int minimum_jumps(int A, int B, int C, int D) {
    int n = N;
    vi mn(n, INF);
    queue<int> q;
    for (int i = A; i <= B; i++) {
        mn[i] = 0;
        q.push(i);
    }

    vector<bool> vis(n, false);
    while (!q.empty()) {
        int u = q.front();
        q.pop();

        if (vis[u]) continue;
        vis[u] = true;

        for (auto &v : adj[u]) {
            mn[v] = min(mn[v], mn[u]+1);
            q.push(v);
        }
    }

    int ans = INF;
    for (int i = C; i<=D; i++) {
        ans = min(ans, mn[i]);
    }

    if (ans == INF) ans = -1;

    return ans;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…