Submission #971163

#TimeUsernameProblemLanguageResultExecution timeMemory
971163dubabubaRainforest Jumps (APIO21_jumps)C++14
0 / 100
167 ms52096 KiB
#include <bits/stdc++.h> #include "jumps.h" using namespace std; template<typename T> void ono_min(T &MIN, T CMP) { if(MIN > CMP) MIN = CMP; } template<typename T> void ono_max(T &MAX, T CMP) { if(MAX < CMP) MAX = CMP; } typedef pair<int, int> pii; #define ff first #define ss second #define MP make_pair const int mxk = 25; const int mxn = 2e5 + 10; int L[mxn], R[mxn], n; vector<int> adj[mxn]; int dis[mxn], h[mxn]; int mx[mxk][mxn]; int mn[mxk][mxn]; bool mx_valid(int k, int i) { return 1 <= mx[k][i] && mx[k][i] <= n; } bool mn_valid(int k, int i) { return 1 <= mn[k][i] && mn[k][i] <= n; } void init(int N, vector<int> H) { memset(L, -1, sizeof L); memset(R, -1, sizeof R); n = N; stack<int> st; st.push(0); for(int i = 1; i < N; i++) { while(st.size() && H[st.top()] <= H[i]) st.pop(); if(st.size()) L[i] = st.top(); st.push(i); } stack<int> en; en.push(0); for(int i = N - 1; i >= 0; i--) { while(en.size() && H[en.top()] <= H[i]) en.pop(); if(en.size()) R[i] = en.top(); en.push(i); } // for(int i = 0; i < mxk; i++) memset(mx[i], -1, sizeof mx[i]); for(int i = 0; i < mxk; i++) memset(mn[i], 0x3f, sizeof mn[i]); // cout << "gay\n"; for(int i = 0; i < N; i++) { h[i] = H[i]; if(L[i] > -1) { adj[i].push_back(L[i]); ono_min(mn[0][H[i]], H[L[i]]); ono_max(mx[0][H[i]], H[L[i]]); } if(R[i] > -1) { adj[i].push_back(R[i]); ono_min(mn[0][H[i]], H[R[i]]); ono_max(mx[0][H[i]], H[R[i]]); } } for(int k = 1; k < mxk; k++) for(int i = 0; i < n; i++) { int mnj = mn[k - 1][i]; int mxj = mx[k - 1][i]; if(1 <= mnj && mnj <= n) mn[k][i] = mn[k - 1][mnj]; if(1 <= mxj && mxj <= n) mx[k][i] = mx[k - 1][mxj]; } // for(int i = 1; i <= n; i++) { // cout << i << ": "; // for(int k = 0; (1 << k) <= n; k++) // cout << mx[k][i] << ' '; // cout << endl; // } // for(int i = 1; i <= n; i++) { // cout << i << ": "; // for(int k = 0; (1 << k) <= n; k++) // cout << mn[k][i] << ' '; // cout << endl; // } } int minimum_jumps(int A, int B, int C, int D) { if(A != B) exit(1); if(C != D) exit(1); if(h[A] > h[C]) return -1; int s = h[A], f = h[C], ans = 0; // cout << s << ' ' << f << endl; for(int k = mxk - 1; k >= 0; k--) if(1 <= mx[k][s] && mx[k][s] <= n && mx[k][s] <= f) { f -= mx[k][s]; s = mx[k][s]; ans ^= (1 << k); } for(int k = mxk - 1; k >= 0; k--) if(1 <= mn[k][s] && mn[k][s] <= n && mn[k][s] <= f) { f -= mn[k][s]; s = mn[k][s]; ans ^= (1 << k); } if(f == 0) return ans; return -1; }
#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...