Submission #1316717

#TimeUsernameProblemLanguageResultExecution timeMemory
1316717daveleRainforest Jumps (APIO21_jumps)C++20
100 / 100
431 ms55252 KiB
#ifndef davele #include "jumps.h" #endif // davele #include <bits/stdc++.h> #include <vector> #define MASK(i) (1ll<<(i)) using namespace std; const int lim = 2e5, limit = lim+5, mxlog = 20, inf = 2e9; void init(int _N, std::vector<int> H); int minimum_jumps(int a, int b, int c, int d); struct Jury{ int n, q; vector <int> H; int A[limit], B[limit], C[limit], D[limit]; void load (){ cin>>n>>q; H.clear(); for (int i=1; i<=n; i++){ int v; cin>>v; H.push_back(v); } for (int i=1; i<=q; i++) cin>>A[i]>>B[i]>>C[i]>>D[i]; } void process(){ init(n, H); for (int i=1; i<=q; i++) cout<<minimum_jumps(A[i], B[i], C[i], D[i])<<"\n"; } } jury; int L[limit][22], R[limit][22], higher[limit][22], A[limit]; int n; int pos_max (int l, int r){ for (int i=mxlog; i>=0; i--){ if (R[l][i]<=r){ // cerr<<l<<"\n"; l = R[l][i]; } } return l; } void prep(){ stack <int> st; for (int i=0 ; i<n; i++){ while (!st.empty() && A[i]>=A[st.top()]) st.pop(); L[i][0] = st.empty() ? i: st.top(); st.push(i); } // cerr<"ok\n"; while (!st.empty()) st.pop(); for (int i=n-1; i>=0; i--){ while (!st.empty() && A[i]>=A[st.top()]) st.pop(); R[i][0] = st.empty() ? i : st.top(); st.push(i); } for (int i=0; i<n; i++){ higher[i][0] = L[i][0]; if (A[R[i][0]]>A[L[i][0]]) higher[i][0] = R[i][0]; } // cout<<"A:\n"; // for (int i=0; i<n; i++){ // cout<<A[i]<<" "; // } // cout<<"\n"; // cout<<"L:\n"; // for (int i=0; i<n; i++){ // cout<<L[i][0]<<" "; // } // cout<<"\n"; // cout<<"R:\n"; // for (int i=0; i<n; i++){ // cout<<R[i][0]<<" "; // } // cout<<"\n"; // cout<<"high:\n"; // for (int i=0; i<n; i++){ // cout<<higher[i][0]<<" "; // } // cout<<"\n"; for (int i=1; i<=mxlog; i++){ for (int j=0; j<n; j++){ L[j][i] = L[L[j][i-1]][i-1]; R[j][i] = R[R[j][i-1]][i-1]; higher[j][i] = higher[higher[j][i-1]][i-1]; } } } void init(int _N, std::vector<int> H) { A[0] = inf; n = _N; for (int i=1; i<=n; i++){ A[i] = H[i-1]; } A[n+1] = inf; n+=2; // cerr<<"ok\n"; prep(); } int minimum_jumps(int a, int b, int c, int d) { // danh so tu 0 -> danh so tu 1 a++; b++; c++; d++; // cout<<A[a]<<" "<<A[c]<<"\n"; if (b+1==c){ if (R[b][0]<=d) return 1; return -1; } // cout<<a<<" "<<b<<" "<<c<<" "<<d<<"\n"; int bestmid = pos_max (b+1, c-1); if (A[b]>A[bestmid]){ return R[b][0] <= d ? 1 : -1; } // cout<<bestmid<<"\n"; int s = b; for (int i=mxlog; i>=0; i--){ if (L[s][i]>=a && A[L[s][i]]<A[bestmid]){ s = L[s][i]; } } // cout<<s<<" "<<"\n"; int ans = 0; if (L[s][0]>=a){ // co the nhay 1 phat an luon if (R[L[s][0]][0]<=d) return 1; } else{ // luu y la co else o day // cout<<s<<"\n"; // nhay theo cac thang higher for (int i=mxlog; i>=0; i--){ if (A[higher[s][i]]<=A[bestmid]){ ans+=MASK(i); s = higher[s][i]; } } // cout<<A[s]<<" "<<s<<"\n"; if (s==bestmid){ return (R[s][0]<=d) ? ans+1 : -1; } if (0<L[s][0] && R[L[s][0]][0]<=d) return ans+2; } for (int i=mxlog; i>=0; i--){ if (R[s][i]<c){ ans+=MASK(i); s = R[s][i]; } } if (R[s][0]<=d && R[s][0]>=c) return ans+1; return -1; } #ifdef davele signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); // const string name = "jumps"; if (fopen((name+".inp").c_str(), "r")){ freopen ((name+".inp").c_str(), "r", stdin); freopen ((name+".out").c_str(), "w", stdout); } jury.load(); jury.process(); } #endif // davele
#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...