Submission #1125106

#TimeUsernameProblemLanguageResultExecution timeMemory
1125106SamueleVidRainforest Jumps (APIO21_jumps)C++20
37 / 100
4085 ms19392 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long

int N;
vector<int> H;
vector<vector<int>> adj;
bool first_subtask = true;

constexpr ll PW = 262144;

struct segment {
    vector<ll> seg;
    segment() {
        seg.assign(2 * PW, 1e9);
    }

    void update(int x, ll d) {
        x += PW;
        seg[x] = d;
        x /= 2;
        while (x >= 1) {
            seg[x] = min(seg[2 * x], seg[2 * x + 1]);
            x /= 2;
        }
    }

    ll query(int l, int r) {
        l += PW; r += PW;
        ll sol = 1e9;
        while (l <= r) {
            if (l % 2 == 1) {
                sol = min(sol, seg[l]);
                l ++;
            }
            if (r % 2 == 0) {
                sol = min(sol, seg[r]);
                r --;
            }
            l /= 2; r /= 2;
        }
        return sol;
    }

    void clear() {
        for (int i = 0; i < 2 * PW; i ++) seg[i] = 1e9;
    }
};

segment seg;

void init(int N, vector<int> H) {
    ::N = N;
    ::H = H;

    vector<int> inv_H(N + 1);
    for (int i = 0; i < N; i ++) inv_H[H[i]] = i;

    for (int i = 0; i < N; i ++) {
        if (H[i] != i + 1) first_subtask = false;
    }
    if (first_subtask) return;

    adj.resize(N);
    // a destra
    for (int i = N - 1; i >= 0; i --) {
        int u = seg.query(H[i] + 1, N);
        if (u != 1e9) adj[i].push_back(u);
        seg.update(H[i], i);
    }

    seg.clear();
    // a sinistra
    for (int i = 0; i < N; i ++) {
        int u = -seg.query(H[i] + 1, N);
        if (u != -1e9) adj[i].push_back(u);
        seg.update(H[i], -i);
    }
}

int minimum_jumps(int A, int B, int C, int D) {
    if (first_subtask) return C - B;
    vector<int> v(N);
    vector<int> d(N, 1e9);
    queue<int> q;
    for (int i = A; i <= B; i ++) {
        q.push(i);
        d[i] = 0;
        v[i] = 1;
    }
    while (!q.empty()) {
        int u = q.front(); q.pop();
        for (auto x : adj[u]) {
            if (v[x]) continue;
            d[x] = d[u] + 1;
            v[x] = 1;
            q.push(x);
        }
    }

    int res = 1e9;
    for (int i = C; i <= D; i ++) res = min(res, d[i]);
    if (res == 1e9) res = -1;
    return 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...