Submission #984104

#TimeUsernameProblemLanguageResultExecution timeMemory
984104MarcusRainforest Jumps (APIO21_jumps)C++17
21 / 100
268 ms48720 KiB
#include "jumps.h" #include <vector> #include <bits/stdc++.h> using namespace std; int n; vector<int> h; const int INF = 2e6; vector<vector<int>> adj(2000); vector<vector<int>> dist(2000, vector<int>(2000, INF)); int powtwo = (int)pow(2, __lg(2000) + !!(2000 & (2000-1))); void bfs(int x) { queue<int> q; vector<bool> visited(n); int start = x; visited[start] = true; dist[start][start] = 0; q.push(start); while (!q.empty()) { int s = q.front(); q.pop(); for (auto u : adj[s]) { if (visited[u]) continue; visited[u] = true; dist[start][u] = dist[start][s]+1; q.push(u); } } } struct SegmentTree { vector<int> t; SegmentTree(int power) : t(2*power) {} void build(vector<int>& a, int v, int tl, int tr) { if (tl == tr) { if (tl < (int)a.size()) t[v] = a[tl]; else t[v] = INF; } else { int tm = (tl + tr) / 2; build(a, v*2, tl, tm); build(a, v*2+1, tm+1, tr); t[v] = min(t[v*2], t[v*2+1]); } } int query(int v, int tl, int tr, int l, int r) { if (l > r) return INF; if (l == tl && r == tr) return t[v]; int tm = (tl + tr) / 2; return min(query(v*2, tl, tm, l, min(r, tm)), query(v*2+1, tm+1, tr, max(l, tm+1), r)); } }; vector<SegmentTree> segdist; void init(int N, std::vector<int> H) { n = N; for (auto u: H) {h.push_back(u);} h.shrink_to_fit(); for (int i=0; i<n; i++) { for (int j=i; j<n; j++) { if (h[i] < h[j]) {adj[i].push_back(j); break;}; } for (int j=i; j>=0; j--) { if (h[i] < h[j]) {adj[i].push_back(j); break;}; } } for (int i=0; i<n; i++) {bfs(i);} for (int i=0; i<n; i++) { SegmentTree segtree(powtwo); segtree.build(dist[i], 1, 0, powtwo-1); segdist.push_back(segtree); } } int minimum_jumps(int A, int B, int C, int D) { int answer = INF; for (int i=A; i<=B; i++) { answer = min(answer, segdist[i].query(1, 0, powtwo-1, C, D)); } return (answer >= INF ? -1 : answer); }
#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...