Submission #671358

#TimeUsernameProblemLanguageResultExecution timeMemory
671358YENGOYANRainforest Jumps (APIO21_jumps)C++17
27 / 100
1139 ms62128 KiB
#include "jumps.h" #include <bits/stdc++.h> using namespace std; bool f = 1; int n, s = 1; vector<int> l, r, h; vector<vector<int>> upmec, uppoqr; vector<bool> used; vector<pair<int, int>> seg; void build(int l, int r, int u) { if (l == r) { if (l < n) seg[u] = { h[l], l }; else seg[u] = { 2e9, l }; return; } int m = (l + r) / 2; build(l, m, 2 * u + 1), build(m + 1, r, 2 * u + 2); seg[u] = min(seg[2 * u + 1], seg[2 * u + 2]); } pair<int, int> get(int l, int r, int lx, int rx, int u) { if (lx >= l && rx <= r) return seg[u]; if (lx > r || rx < l) return { 2e9, -1 }; int m = (lx + rx) / 2; return min(get(l, r, lx, m, 2 * u + 1), get(l, r, m + 1, rx, 2 * u + 2)); } void calcDp(int u, vector<int> &dp, int c, int d){ if(dp[u] != -1) return; if(u >= c && u <= d) { dp[u] = 0; return; } if(l[u] != -1 && r[u] != -1) { calcDp(l[u], dp, c, d); calcDp(r[u], dp, c, d); dp[u] = min(dp[l[u]], dp[r[u]]) + 1; } else if(l[u] != -1) { calcDp(l[u], dp, c, d); dp[u] = dp[l[u]] + 1; } else if(r[u] != -1){ calcDp(r[u], dp, c, d); dp[u] = dp[r[u]] + 1; } else dp[u] = 1e9; } void calcUp(int u){ if(used[u]) return; used[u] = 1; if(r[u] != -1 && l[u] != -1){ if(h[r[u]] > h[l[u]]){ calcUp(r[u]), calcUp(l[u]); upmec[u][0] = r[u]; uppoqr[u][0] = l[u]; for(int i = 1; i < 20; i++){ if(upmec[u][i - 1] == -1) upmec[u][i] = -1; else upmec[u][i] = upmec[upmec[u][i - 1]][i - 1]; if(uppoqr[u][i - 1] == -1) uppoqr[u][i] = -1; else uppoqr[u][i] = uppoqr[uppoqr[u][i - 1]][i - 1]; } } else{ calcUp(r[u]), calcUp(l[u]); upmec[u][0] = l[u]; uppoqr[u][0] = r[u]; for(int i = 1; i < 20; i++){ if(upmec[u][i - 1] == -1) upmec[u][i] = -1; else upmec[u][i] = upmec[upmec[u][i - 1]][i - 1]; if(uppoqr[u][i - 1] == -1) uppoqr[u][i] = -1; else uppoqr[u][i] = uppoqr[uppoqr[u][i - 1]][i - 1]; } } } else if(r[u] != -1){ calcUp(r[u]); upmec[u][0] = uppoqr[u][0] = r[u]; for(int i = 1; i < 20; i++){ if(upmec[u][i - 1] == -1) upmec[u][i] = uppoqr[u][i] = -1; else upmec[u][i] = uppoqr[u][i] = upmec[upmec[u][i - 1]][i - 1]; } } else if(l[u] != -1){ calcUp(l[u]); upmec[u][0] = uppoqr[u][0] = l[u]; for(int i = 1; i < 20; i++){ if(upmec[u][i - 1] == -1) upmec[u][i] = uppoqr[u][i] = -1; else upmec[u][i] = uppoqr[u][i] = upmec[upmec[u][i - 1]][i - 1]; } } else { for(int i = 0; i < 20; i++) uppoqr[u][i] = upmec[u][i] = -1; } } void init(int N, vector<int> H) { n = N, h = H; l = r = vector<int> (n, -1); while(s < n) s <<= 1; seg.resize(2 * s); build(0, s - 1, 0); upmec = uppoqr = vector<vector<int>> (n, vector<int> (20)); used = vector<bool> (n); for(int i = 0; i < n; i++) if(h[i] != i + 1) f = 0; if(f) return; stack<pair<int, int>> st; st.push({1e9, -1}); for(int i = n - 1; i >= 0; i--){ while(st.top().first < h[i]){ st.pop(); } r[i] = st.top().second; st.push({h[i], i}); } while(st.size())st.pop(); st.push({1e9, -1}); for(int i = 0; i < n; i++){ while(st.top().first < h[i]){ st.pop(); } l[i] = st.top().second; st.push({h[i], i}); } for(int i = 0; i < n; i++) { if(!used[i]) calcUp(i); } // up[i][j] } int minimum_jumps(int A, int B, int C, int D) { if(f) return C - B; int ans = 0; if(C == D){ pair<int, int> pp = get(A, B, 0, s - 1, 0); int node = pp.second; for(int i = 19; i >= 0; i--){ if(upmec[node][i] == -1) continue; if(h[upmec[node][i]] <= h[C]){ ans += (1 << i); node = upmec[node][i]; } } for(int i = 19; i >= 0; i--){ if(uppoqr[node][i] == -1) continue; if(h[uppoqr[node][i]] <= h[C]){ ans += (1 << i); node = uppoqr[node][i]; } } if(node == C) return ans; else return -1; } vector<int> dp(n, -1); for(int i = A; i <= B; i++) calcDp(i, dp, C, D); ans = 2e9; for(int i = A; i <= B; i++){ ans = min(ans, dp[i]); } if (ans >= 1e9) return -1; return ans; }
#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...