제출 #413219

#제출 시각아이디문제언어결과실행 시간메모리
413219CSQ31밀림 점프 (APIO21_jumps)C++14
23 / 100
1539 ms45924 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[h[i]].pb(stk.top().fi); 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[h[i]].pb(stk.top().fi); stk.push({h[i],i}); } for(int i=0;i<n;i++){ if(sz(adj[i]) >1){ hpar[0][i] = max(adj[i][0],adj[i][1]); lpar[0][i] = min(adj[i][0],adj[i][1]); } else if(sz(adj[i])) lpar[0][i] = adj[i][0]; } for(int j=1;j<20;j++){ for(int i=0;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){ if(a==b && c==d){ int cur = H[a]; int ans = 0; for(int i=19;i>=0;i--){ if(hpar[i][cur] && hpar[i][cur] <= H[d]){ ans+=(1<<i); cur = hpar[i][cur]; } } for(int i=19;i>=0;i--){ if(lpar[i][cur] && lpar[i][cur] <= H[d]){ ans+=(1<<i); cur = lpar[i][cur]; } } if(cur == H[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...