제출 #740526

#제출 시각아이디문제언어결과실행 시간메모리
740526Berryisbetter밀림 점프 (APIO21_jumps)C++17
4 / 100
1002 ms8124 KiB
#include <bits/stdc++.h> #include "jumps.h" using namespace std; using ll = long long; vector<ll> seg, br, d; ll n; ll qw(ll a, ll b) { b++; ll ans = 0; for (a += n, b += n; a < b; a /= 2, b /= 2) { if (a % 2) { ans = max(ans, seg[a]); a++; } if (b % 2) { b--; ans = max(ans, seg[b]); } } return ans; } ll ind(ll v, ll a, ll b) { if (a == b) { return a; } ll m = (a + b) / 2; if (qw(a, m) >= v) { return ind(v, a, m); } return ind(v, m + 1, b); } void init(int N, std::vector<int> H) { n = N; seg = vector<ll>(2 * n + 1, 0); //segment setup for (ll i = 0; i < n; i++) { seg[i + n] = H[i]; } for (ll i = n - 1; i > 0; i--) { seg[i] = max(seg[2 * i], seg[2 * i + 1]); } //br setup br = vector<ll>(n, 0); for (ll i = 0; i < n; i++) { br[i] = i + 1; } for (ll i = n - 1; i >= 0; i--) { ll j = i; while (br[j] != n) { if (H[i] < H[br[j]]) { break; } j = br[j]; } br[i] = br[j]; } //distance d = vector<ll>(n + 1); d[n] = 0; for (ll i = n - 1; i >= 0; i--) { d[i] = d[br[i]] + 1; } } //ind,qw,d int minimum_jumps(int A, int B, int C, int D) { if (B == C) { return 0; } ll w=qw(B,C-1); ll x = ind(w, C, D); if (d[B] > d[x]) { return d[B] - d[x]; } return -1; } /*#include <bits/stdc++.h> using namespace std; using ll = long long; int main() { ll n; cin >> n; vector<ll> a(n), r(n); for (ll i = 0; i < n; i++) { cin >> a[i]; r[i] = i - 1; } for (ll i = 0; i < n; i++) { ll j = i; while (r[j] != -1) { if (a[i] > a[r[j]]) { break; } j = r[j]; } r[i] = r[j]; cout << r[i] + 1 << '\n'; } }*/
#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...