Submission #1204064

#TimeUsernameProblemLanguageResultExecution timeMemory
1204064jasonicRainforest Jumps (APIO21_jumps)C++20
33 / 100
4100 ms42308 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define fastIO cin.tie(0); ios::sync_with_stdio(false)

int n;
int l[200005];
int r[200005];

struct Element{
    int idx, val;

    Element(): val(-1), idx(-1) {};
    Element(int a, int b): val(a), idx(b) {};

    bool operator<(const Element &b) const {
        return val < b.val;
    }

    bool operator>(const Element &b) const {
        return val > b.val;
    }
};

struct SegTree{
    int l, r;
    int mn, mx;
    Element maxEl;
    SegTree *lt, *rt;

    void comb() {
        mn = min(lt->mn, rt->mn);
        mx = max(lt->mx, rt->mx);
        maxEl = max(lt->maxEl, rt->maxEl);
    }

    SegTree(): l(0), r(0), mn(0), mx(0), lt(nullptr), rt(nullptr) {};
    
    SegTree(int bl, int br, vector<Element> &a) {
        l = bl; r = br;
        lt = rt = nullptr;
        mx = -1;
        mn = n;

        if(l == r) {
            maxEl = a[l];
        } else {
            int m = l + (r-l)/2;
            lt = new SegTree(l, m, a);
            rt = new SegTree(m+1, r, a);
            comb();
        }
    }

    void upd(int i) {
        if(i < l || r < i) return;
        if(i == l && l == r) {
            mn = mx = i;
        } else {
            lt->upd(i);
            rt->upd(i);
            comb();
        }
    }

    int qryMx(int ql, int qr) {
        if(qr < l || r < ql) return -1;
        if(ql <= l && r <= qr) return mx;
        else return max(lt->qryMx(ql, qr), rt->qryMx(ql, qr));
    }

    int qryMn(int ql, int qr) {
        if(qr < l || r < ql) return n;
        if(ql <= l && r <= qr) return mn;
        else return min(lt->qryMn(ql, qr), rt->qryMn(ql, qr));
    }

    Element starting(int ql, int qr) {
        if(qr < l || r < ql) return Element();
        if(ql <= l && r <= qr) return maxEl;
        else return max(lt->starting(ql, qr), rt->starting(ql, qr));
    }
};

SegTree segtree;
unordered_map<int, vector<int>> adjList;

void connect(int x, int y) {
    adjList[x].push_back(y);
}

void init(int N, vector<int> h) {
    n = N;
    set<int> process_idx;
    vector<Element> a;
    for(int i = 0; i < n; i++) {
        a.push_back(Element(h[i], i));
    }
    segtree = SegTree(0, n-1, a);

    sort(a.begin(), a.end(), greater());
    for(int i = 0; i < n; i++) {
        l[a[i].idx] = segtree.qryMx(0, max(a[i].idx, 0));
        r[a[i].idx] = segtree.qryMn(min(a[i].idx, n-1), n-1);
        segtree.upd(a[i].idx);
        int x = a[i].idx;
        int y = l[a[i].idx];
        int z = r[a[i].idx];
        if(y>=0) connect(x, y);
        if(z<=n-1) connect(x, z);
    }
}

int minimum_jumps(int a, int b, int c, int d) {
    vector<int> dist(n, -1);
    queue<int> bfs;
    for(int i = a; i <= b; i++) {
        dist[i] = 0;
        bfs.push(i);
    }
    while(!bfs.empty()) {
        int curr = bfs.front(); bfs.pop();
        if(c <= curr && curr <= d) return dist[curr];

        for(auto i : adjList[curr]) {
            if(dist[i] != -1) continue;
            dist[i] = dist[curr] + 1;
            bfs.push(i);
        }
    }
    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...