Submission #1112787

#TimeUsernameProblemLanguageResultExecution timeMemory
1112787PagodePaivaRainforest Jumps (APIO21_jumps)C++17
33 / 100
4041 ms12388 KiB
#include<bits/stdc++.h> #include "jumps.h" #define fr first #define sc second using namespace std; const int N = 200010; struct Segtree{ pair <int, int> tree[4*N]; pair <int, int> join(pair <int, int> a, pair <int, int> b){ return {min(a.fr, b.fr), max(a.sc, b.sc)}; } void build(int node, int l, int r){ if(l == r){ tree[node] = {1e9, 0}; return; } int mid = (l+r)/2; build(2*node, l, mid); build(2*node+1, mid+1, r); tree[node] = join(tree[2*node], tree[2*node+1]); return; } void update(int node, int l, int r, int pos, int val){ if(l == r){ tree[node] = {l, l}; return; } int mid = (l+r)/2; if(l <= pos and pos <= mid) update(2*node, l, mid, pos, val); else update(2*node+1, mid+1, r, pos, val); tree[node] = join(tree[2*node], tree[2*node+1]); return; } pair <int, int> query(int node, int l, int r, int tl, int tr){ if(l > tr or tl > r) return {1e9, -1}; if(l <= tl and tr <= r) return tree[node]; int mid = (tl+tr)/2; return join(query(2*node, l, r, tl, mid), query(2*node+1, l, r, mid+1, tr)); } } seg; int l[N], r[N]; int n; void init(int N, vector<int> h) { n = N; vector <pair <int, int>> v; for(int i = 0;i < n;i++){ v.push_back({h[i], i+1}); } sort(v.begin(), v.end()); reverse(v.begin(), v.end()); seg.build(1, 1, n); for(auto [val, pos] : v){ l[pos] = r[pos] = -1; if(seg.query(1, 1, pos-1, 1, n).sc > 0) l[pos] = seg.query(1, 1, pos-1, 1, n).sc; if(seg.query(1, pos+1, n, 1, n).fr < 1e9) r[pos] = seg.query(1, pos+1, n, 1, n).fr; seg.update(1,1, n, pos, pos); } } int dist[N]; int minimum_jumps(int a, int b, int c, int d) { queue <int> q; a++; b++; c++; d++; for(int i = 1;i <= n;i++){ dist[i] = -1; } for(int i = a;i <= b;i++){ dist[i] = 0; q.push(i); } while(!q.empty()){ int v = q.front(); q.pop(); if(l[v] != -1){ if(dist[l[v]] == -1){ dist[l[v]] = dist[v]+1; q.push(l[v]); } } if(r[v] != -1){ if(dist[r[v]] == -1){ dist[r[v]] = dist[v]+1; q.push(r[v]); } } } int res = 1e8; for(int i = c;i <= d;i++){ if(dist[i] == -1) continue; res = min(res, dist[i]); } return (res == 1e8 ? -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...