제출 #1199106

#제출 시각아이디문제언어결과실행 시간메모리
1199106origabai밀림 점프 (APIO21_jumps)C++20
48 / 100
526 ms85004 KiB
#include "jumps.h" #include <bits/stdc++.h> using namespace std; int N; vector<int> H; int lg; vector<vector<int>> out; vector<vector<int>> mn,mx,fr,bk,rmq; void init(int N2, std::vector<int> H2){ N=N2; H=H2; H.push_back(1e9); lg = log2(N) + 1; mx.resize(lg); mn.resize(lg); fr.resize(lg); bk.resize(lg); rmq.resize(lg); for (int i=0;i<lg;i++){ mx[i].resize(N+1); mn[i].resize(N+1); fr[i].resize(N+1); bk[i].resize(N+1); rmq[i].resize(N+1); fill(fr[i].begin(),fr[i].end(),N); fill(bk[i].begin(),bk[i].end(),N); } stack<int> s; out.resize(N); for (int i=0;i<N;i++){ while (s.size() && H[s.top()] < H[i]){ out[s.top()].push_back(i); fr[0][s.top()] = (i); s.pop(); } s.push(i); } while (s.size()) s.pop(); for (int i=N-1;i>=0;i--){ while (s.size() && H[s.top()] < H[i]){ out[s.top()].push_back(i); bk[0][s.top()] = i; s.pop(); } s.push(i); } for (int i=0;i<N;i++){ if (out[i].size() == 1){ mx[0][i] = mn[0][i] = out[i][0]; } else if (out[i].size() == 2){ int a = out[i][0], b = out[i][1]; if (H[a] > H[b]) swap(a,b); mn[0][i] = a; mx[0][i] = b; } else { mn[0][i] = mx[0][i] = N; } } iota(rmq[0].begin(),rmq[0].end(),0); mx[0][N] = mn[0][N] = N; for (int i=1;i<lg;i++){ for (int j=0;j<=N;j++){ mx[i][j] = mx[i-1][mx[i-1][j]]; mn[i][j] = mn[i-1][mn[i-1][j]]; fr[i][j] = fr[i-1][fr[i-1][j]]; bk[i][j] = bk[i-1][bk[i-1][j]]; int a = rmq[i-1][j]; int b = rmq[i-1][min(N,j + (1<<(i-1)))]; if (H[a] > H[b]){ rmq[i][j] = a; } else { rmq[i][j] = b; } } } } int get_max(int l, int r){ int g = log2(r-l+1); int x = rmq[g][l]; int y = rmq[g][r - (1<<g) + 1]; if (H[x] > H[y]) return x; return y; } int minimum_jumps(int A, int B, int C, int D) { if (H[B] > H[C]) return -1; int l = A, r = B; int pref = B; while (l < r){ int m = (l+r)/2; if (H[get_max(m+1,r)] < H[C]){ pref = m+1; r = m; } else { l = m+1; } } if (l == r){ if (H[l]< H[C]) pref = l; } A = get_max(pref, B); int ans = 0; for (int k=lg-1;(A!=C) && (k>=0);k--){ if (H[mx[k][A]] <= H[C]){ A = mx[k][A]; ans += (1 << k); } } for (int k=lg-1;(A!=C) && (k>=0);k--){ if (H[mn[k][A]] <= H[C]){ A = mn[k][A]; ans += (1 << k); } } if (A == C){ return ans; } return -1; }
#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...