Submission #416859

#TimeUsernameProblemLanguageResultExecution timeMemory
416859CSQ31Rainforest Jumps (APIO21_jumps)C++14
23 / 100
1152 ms45952 KiB
#include "jumps.h" #include<bits/stdc++.h> using namespace std; #define pb push_back #define fi first #define se second #define sz(a) (int)(a.size()) typedef long long int ll; typedef pair<int,int> pii; typedef vector<vector<int>> vii; const int MAXN = 2e5+5; vii adj(MAXN); int hpar[20][MAXN],lpar[20][MAXN]; vector<int>H; void init(int n, vector<int>h){ H = h; stack<pii>stk; for(int i=0;i<n;i++){ while(!stk.empty() && stk.top().fi < h[i])stk.pop(); if(!stk.empty())adj[i+1].pb(stk.top().se+1); stk.push({h[i],i}); } while(!stk.empty())stk.pop(); for(int i=n-1;i>=0;i--){ while(!stk.empty() && stk.top().fi < h[i])stk.pop(); if(!stk.empty())adj[i+1].pb(stk.top().se+1); stk.push({h[i],i}); } for(int i=1;i<=n;i++){ if(sz(adj[i]) >1){ hpar[0][i] = h[adj[i][0]-1]<h[adj[i][1]-1] ? adj[i][1] : adj[i][0]; lpar[0][i] = h[adj[i][0]-1]>h[adj[i][1]-1] ? adj[i][1] : adj[i][0]; } else if(sz(adj[i])) lpar[0][i] = adj[i][0]; } for(int j=1;j<20;j++){ for(int i=1;i<=n;i++){ hpar[j][i] = hpar[j-1][hpar[j-1][i]]; lpar[j][i] = lpar[j-1][lpar[j-1][i]]; } } } int minimum_jumps(int a,int b,int c,int d){ a++; b++; c++; d++; if(a==b && c==d){ int cur = a; int ans = 0; for(int i=19;i>=0;i--){ if(hpar[i][cur] && H[hpar[i][cur]-1] <= H[d-1]){ ans+=(1<<i); cur = hpar[i][cur]; } } for(int i=19;i>=0;i--){ if(lpar[i][cur] && H[lpar[i][cur]-1] <= H[d-1]){ ans+=(1<<i); cur = lpar[i][cur]; } } if(cur == d)return ans; else return -1; } 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...