제출 #1311048

#제출 시각아이디문제언어결과실행 시간메모리
1311048vtnoo밀림 점프 (APIO21_jumps)C++20
48 / 100
403 ms52952 KiB
#include "jumps.h" #include <bits/stdc++.h> #define L(i, j, k) for(int i = (j); i <= (k); i++) #define R(i, j, k) for(int i = (j); i >= (k); i--) #define ll long long #define sz(a) ((int) a.size()) #define all(a) a.begin(), a.end() #define vi vector<int> #define pb emplace_back #define me(a, x) memset(a, x, sizeof(a)) #define fst first #define snd second #define ii pair<int,int> using namespace std; const int MAXN=2e5+5,LOG=20,INF=1e9; int h[MAXN],sl[MAXN],sr[MAXN],upf[MAXN][LOG],upl[MAXN][LOG],upr[MAXN][LOG],n; vi adj[MAXN]; void init(int N, std::vector<int> H) { n=N; stack<ii>mn; L(i,0,N-1){ while(sz(mn)&&mn.top().fst<=H[i]){ mn.pop(); } sl[i]=sz(mn)?mn.top().snd:i; mn.push({H[i],i}); } while(sz(mn))mn.pop(); R(i,N-1,0){ while(sz(mn)&&mn.top().fst<=H[i]){ mn.pop(); } sr[i]=sz(mn)?mn.top().snd:i; mn.push({H[i],i}); } L(i,0,N-1)h[i]=H[i]; L(i,0,N-1){ if(h[sl[i]]>h[sr[i]]){ upf[i][0]=sl[i]; }else{ upf[i][0]=sr[i]; } upl[i][0]=sl[i]; upr[i][0]=sr[i]; } L(i,1,LOG-1){ L(j,0,N-1){ upl[j][i]=upl[upl[j][i-1]][i-1]; upr[j][i]=upr[upr[j][i-1]][i-1]; upf[j][i]=upf[upf[j][i-1]][i-1]; } } } int minimum_jumps(int A, int B, int C, int D) { if(A>=C&&A<=D)return 0; if(B>=C&&B<=D)return 0; int u=B; R(i,LOG-1,0){ if(upl[u][i]==u)continue; if(upl[u][i]<A)continue; if(sr[upl[u][i]]==upl[u][i])continue; if(sr[upl[u][i]]<=D){ u=upl[u][i]; } } //~ cout<<u<<endl; int ans=0; R(i,LOG-1,0){ if(upf[u][i]==u)continue; if(sr[upf[u][i]]==upf[u][i])continue; if(upf[u][i]>=C)continue; if(sr[upf[u][i]]<=D){ u=upf[u][i]; ans+=(1<<i); } } //~ cout<<u<<endl; R(i,LOG-1,0){ if(upr[u][i]==u)continue; if(upr[u][i]<C){ u=upr[u][i]; ans+=(1<<i); } } //~ cout<<u<<endl; if(C<=sr[u]&&sr[u]<=D)return ans+1; return -1; } //~ int main(){ //~ int N,Q;cin>>N>>Q; //~ vi H(N); //~ L(i,0,N-1)cin>>H[i]; //~ init(N,H); //~ while(Q--){ //~ int A,B,C,D;cin>>A>>B>>C>>D; //~ cout<<minimum_jumps(A,B,C,D)<<endl; //~ } //~ }
#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...