Submission #1162682

#TimeUsernameProblemLanguageResultExecution timeMemory
1162682brintonRainforest Jumps (APIO21_jumps)C++20
23 / 100
363 ms43488 KiB
#include "jumps.h" #include <bits/stdc++.h> using namespace std; #define inf 1000000 vector<vector<int>> edges; vector<int> H; vector<vector<int>> big,small; int N; int k; void init(int iN, std::vector<int> iH) { N = iN; H = iH; // create DAG using monotic array stack<int> st; edges.resize(N+1); // create front for(int i = 0;i < N;i++){ while(!st.empty() && st.top() < H[i]){ st.pop(); } if(!st.empty()){ edges[H[i]].push_back(st.top()); } st.push(H[i]); } while(!st.empty()) st.pop(); // from back for(int i = N-1;i >= 0;i--){ while(!st.empty() && st.top() < H[i]){ st.pop(); } if(!st.empty()){ edges[H[i]].push_back(st.top()); } st.push(H[i]); } for(auto &i:edges){ if(i.size() == 0){ i.push_back(-1); i.push_back(-1); continue; } if(i.size() == 1){ i.push_back(i[0]); continue; } if(i[0] < i[1]) swap(i[0],i[1]); } // edges[0] -> big, edges[1] -> small //create edges ok, lets create binary jump k = __lg(N); big = small = vector<vector<int>>(k+1,vector<int>(N+1,0)); // zero layer for(int i = 1;i <= N;i++){ big[0][i] = edges[i][0]; small[0][i] = edges[i][1]; } for(int l = 1;l <= k;l++){ for(int i = 1;i <= N;i++){ if(big[l-1][i] == -1){ big[l][i] = -1; }else{ // cout << l-1 << " " << i << ":" << big[l-1][i] << endl; big[l][i] = big[l-1][big[l-1][i]]; } if(small[l-1][i] == -1){ small[l][i] = -1; }else{ small[l][i] = small[l-1][small[l-1][i]]; } } } // for(int l = 0;l <= k;l++){ // for(int i = 1;i <= N;i++){ // cout << big[l][i] << " "; // } // cout << endl; // } // for(int l = 0;l <= k;l++){ // for(int i = 1;i <= N;i++){ // cout << small[l][i] << " "; // } // cout << endl; // } } int minimum_jumps(int A, int B, int C, int D) { // A == B and C == D int cnt = 0; int cur = H[A]; // cout << k << " " << cur << endl; // cout << big.size() << " " << big[0].size() << endl; for(int l = k;l >= 0;l--){ if(big[l][cur] != -1 && big[l][cur] <= H[C]){ cur = big[l][cur]; cnt+=(1 << l); } } for(int l = k;l >= 0;l--){ if(small[l][cur] != -1 && small[l][cur] <= H[C]){ cur = small[l][cur]; cnt+=(1 << l); } } if(cur != H[C]){ return -1; }else{ return cnt; } } // grader // #include "jumps.h" // #include <cassert> // #include <cstdio> // #include <vector> // int main() { // int N, Q; // assert(2 == scanf("%d %d", &N, &Q)); // std::vector<int> H(N); // for (int i = 0; i < N; ++i) { // assert(1 == scanf("%d", &H[i])); // } // init(N, H); // for (int i = 0; i < Q; ++i) { // int A, B, C, D; // assert(4 == scanf("%d %d %d %d", &A, &B, &C, &D)); // printf("%d\n", minimum_jumps(A, B, C, D)); // } // return 0; // }
#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...