Submission #1175004

#TimeUsernameProblemLanguageResultExecution timeMemory
1175004JohanRainforest Jumps (APIO21_jumps)C++20
33 / 100
4006 ms19296 KiB
#include "jumps.h" #include "bits/stdc++.h" using namespace std; const int MAX = 3e5 + 6; const int LOG = 25; const int inf = 1e9; const int mod = 1e9 + 7; const int block = 333; // mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); int st[MAX * 4]; queue < int > q; vector < int > d(MAX, -1); vector < vector < int > > adj(MAX); void fix(){ d.assign(MAX, -1); while(q.size()) q.pop(); } void bfs(){ while(q.size()){ int v = q.front(); q.pop(); for(auto u : adj[v]){ if(d[u] == -1){ q.push(u); d[u] = d[v] + 1; } } } } void upd(int v, int l, int r, int pos, int val){ if(l == r){ st[v] = val; return ; } int mid = (l + r) >> 1; if(mid >= pos) upd(v * 2, l, mid, pos, val); else upd(v * 2 + 1, mid + 1, r, pos, val); st[v] = max(st[v * 2], st[v * 2 + 1]); } int ask(int v, int l, int r, int ql, int qr){ if(l > qr || r < ql) return -inf; if(l >= ql && r <= qr) return st[v]; int mid = (l + r) >> 1; return max(ask(v * 2, l, mid, ql, qr), ask(v * 2 + 1, mid + 1, r, ql, qr)); } void init(int N, vector<int> H) { int n = N; vector < int > h = H; for(int i = 0; i < n; i++) upd(1, 0, n - 1, i, h[i]); for(int i = 0; i < n; i++){ int l = i + 1, r = n - 1; int best = -1; while(r >= l){ int mid = (l + r) >> 1; if(ask(1, 0, n - 1, i + 1, mid) >= h[i]){ r = mid - 1; best = mid; } else l = mid + 1; } if(best != -1) adj[i].push_back(best); l = 0, r = i - 1; best = -1; while(r >= l){ int mid = (l + r) >> 1; if(ask(1, 0, n - 1, mid, i - 1) >= h[i]){ l = mid + 1; best = mid; } else r = mid - 1; } if(best != -1) adj[i].push_back(best); } } int minimum_jumps(int A, int B, int C, int D){ fix(); for(int i = A; i <= B; i++){ d[i] = 0; q.push(i); } bfs(); int mn = inf; for(int i = C; i <= D; i++){ if(d[i] == -1) continue; mn = min(mn, d[i]); } return (mn == inf ? -1 : mn); } // signed main(){ // int n, q; // cin >> n >> q; // vector < int > a(n); // for(int i = 0; i < n; i++) // cin >> a[i]; // init(n, a); // while(q--){ // int a, b, c, d; // cin >> a >> b >> c >> d; // cout << minimum_jumps(a, b, c, d) << endl; // } // }
#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...