제출 #1138263

#제출 시각아이디문제언어결과실행 시간메모리
1138263AbdullahIshfaq밀림 점프 (APIO21_jumps)C++20
48 / 100
413 ms45864 KiB
#include "jumps.h" #include <bits/stdc++.h> using namespace std; const int MAXN = 2e5+5, LOG = 18; int N, H[MAXN], L[MAXN][LOG], R[MAXN][LOG], T[MAXN][LOG], mx; stack <int> st; void init(int n, vector<int> h) { N = n; H[0] = H[N+1] = N+1; for (int i=1;i<=N;i++) { H[i] = h[i-1]; } st.push(0); R[0][0] = R[N+1][0] = N+1; for (int i=1;i<=N+1;i++) { while (H[st.top()] < H[i]) { R[st.top()][0] = i; st.pop(); } L[i][0] = st.top(); st.push(i); } for (int i=0;i<=N+1;i++) { if (H[L[i][0]] > H[R[i][0]]) { T[i][0] = L[i][0]; } else { T[i][0] = R[i][0]; } } for (int i=1;i<LOG;i++) { for (int j=0;j<=N+1;j++) { T[j][i] = T[T[j][i-1]][i-1]; L[j][i] = L[L[j][i-1]][i-1]; R[j][i] = R[R[j][i-1]][i-1]; } } } int minimum_jumps(int A, int B, int C, int D) { A++; B++; C++; D++; mx = B; for (int i=LOG-1;i>=0;i--) { if (R[mx][i] < C) { mx = R[mx][i]; } } mx = R[mx][0]; if (mx > D) { return -1; } for (int i=LOG-1;i>=0;i--) { if (H[L[B][i]] <= H[mx] && L[B][i] >= A) { B = L[B][i]; } } if (L[B][0] >= A && R[L[B][0]][0] <= D) { return 1; } int ans = 0; for (int i=LOG-1;i>=0;i--) { if (H[T[B][i]] <= H[mx]) { ans += 1<<i; B = T[B][i]; } } if (R[B][0] == mx) { return ans+1; } if (R[L[B][0]][0] <= D) { return ans+2; } for (int i=LOG-1;i>=0;i--) { if (R[B][i] <= mx) { ans += 1<<i; B = R[B][i]; } } 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...