제출 #1175022

#제출 시각아이디문제언어결과실행 시간메모리
1175022JohanRainforest Jumps (APIO21_jumps)C++20
0 / 100
2595 ms1114112 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]; vector < int > nodes; vector < bool > vis(MAX, 0); vector < vector < int > > adj(MAX); unordered_map < int , unordered_map < int , int > > d; void bfs(int s){ if(d.find(s) != d.end()) return; queue < int > q; q.push(s); d[s][s] = 0; while(q.size()){ int v = q.front(); q.pop(); for(auto u : adj[v]){ if(!d[s].count(u)){ q.push(u); d[s][u] = d[s][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); // cout << i << ' ' << best << endl; } 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); // cout << i << ' ' << best << endl; } } } int minimum_jumps(int A, int B, int C, int D){ int u = B, v = C; bfs(u); return (d[u].count(v) ? d[u][v] : -1); } // 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...