제출 #981225

#제출 시각아이디문제언어결과실행 시간메모리
981225Darren0724밀림 점프 (APIO21_jumps)C++17
56 / 100
4072 ms39052 KiB
#include "jumps.h" #include <bits/stdc++.h> using namespace std; int n; vector<int> v,a,b,pl,mark; int jump[20][200005]; int jump1[20][200005]; void init(int N, vector<int> H) { n=N; v=H; a.resize(n,-1); b.resize(n,-1); pl.resize(n+1); mark.resize(n+1); vector<int> st; for(int i=0;i<n;i++){ pl[v[i]]=i; while(st.size()&&v[st.back()]<v[i]){ st.pop_back(); } a[i]=(st.size()?st.back():-1); st.push_back(i); } st.clear(); for(int i=n-1;i>=0;i--){ while(st.size()&&v[st.back()]<v[i]){ st.pop_back(); } b[i]=(st.size()?st.back():-1); st.push_back(i); } for(int i=0;i<n;i++){ if(a[i]==-1){ swap(a[i],b[i]); mark[i]=1; } else if(b[i]==-1){ continue; } else { if(v[a[i]]<v[b[i]]){ swap(a[i],b[i]); mark[i]=1; } } } for(int j=n;j>=1;j--){ int i=pl[j]; int now=a[i]; jump[0][i]=now; for(int k=1;k<20;k++){ if(now==-1){ jump[k][i]=-1; continue; } else{ now=jump[k][i]=jump[k-1][now]; } } now=b[i]; jump1[0][i]=now; for(int k=1;k<20;k++){ if(now==-1){ jump1[k][i]=-1; continue; } else{ now=jump1[k][i]=jump1[k-1][now]; } } } for(int i=0;i<n;i++){ if(mark[i]){ swap(a[i],b[i]); } } } int f(int A, int C) { int ans=0; int now=A; for(int k=19;k>=0;k--){ int tmp=jump[k][now]; if(tmp!=-1&&v[tmp]<=v[C]){ ans+=(1<<k); now=tmp; } } for(int k=19;k>=0;k--){ int tmp=jump1[k][now]; if(tmp!=-1&&v[tmp]<=v[C]){ ans+=(1<<k); now=tmp; } } if(now!=C)ans=1e9; //cout<<A<<' '<<C<<' '<<ans<<endl; return ans; } int minimum_jumps(int A, int B, int C, int D) { int ans=1e9; vector<int> t(n+1); vector<int> r; for(int i=A;i<=B;i++){ if(b[i]!=-1&&b[i]<=B)continue; t[i]=1; r.push_back(v[i]); } for(int j=C;j<=D;j++){ if(a[j]!=-1&&a[j]>=C)continue; t[j]=1; r.push_back(v[j]); } sort(r.begin(),r.end()); int tmp=-1; for(int i:r){ if(pl[i]<=B){ tmp=pl[i]; } else{ if(tmp!=-1)ans=min(ans,f(tmp,pl[i])); } } if(ans==1e9)ans=-1; return ans; }
#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...