제출 #925025

#제출 시각아이디문제언어결과실행 시간메모리
925025TAhmed33밀림 점프 (APIO21_jumps)C++17
0 / 100
155 ms42988 KiB
#include <bits/stdc++.h> using namespace std; const int MAXN = 2e5 + 25; int a[MAXN], prv[MAXN], nxt[MAXN], n; vector <int> adj[MAXN]; int dep[MAXN], dep2[MAXN], dp[19][MAXN], dp2[19][MAXN]; int idx[MAXN]; void init (int N, vector <int> h) { n = N; for (int i = 0; i < n; i++) a[i + 1] = h[i]; stack <int> cur; cur.push(1); for (int i = 2; i <= n; i++) { while (!cur.empty() && a[i] > a[cur.top()]) { nxt[cur.top()] = i; cur.pop(); } cur.push(i); } while (!cur.empty()) { nxt[cur.top()] = 0; cur.pop(); } for (int i = n; i >= 1; i--) { dp2[0][i] = nxt[i]; dep2[i] = 1 + dep2[nxt[i]]; } for (int i = 1; i < 19; i++) { for (int j = 1; j <= n; j++) { dp2[i][j] = dp2[i - 1][dp2[i - 1][j]]; } } cur.push(n); for (int i = n - 1; i >= 1; i--) { while (!cur.empty() && a[i] > a[cur.top()]) { prv[cur.top()] = i; cur.pop(); } cur.push(i); } while (!cur.empty()) { prv[cur.top()] = 0; cur.pop(); } for (int i = 1; i <= n; i++) { adj[prv[i]].push_back(i); dep[i] = 1 + dep[prv[i]]; dp[0][i] = prv[i]; } for (int i = 1; i < 19; i++) { for (int j = 1; j <= n; j++) { dp[i][j] = dp[i - 1][dp[i - 1][j]]; } } for (int i = 0; i <= n; i++) { sort(adj[i].begin(), adj[i].end()); for (int j = 0; j < (int)adj[i].size(); j++) { idx[adj[i][j]] = j; } } } int jump (int a, int b) { for (int i = 18; i >= 0; i--) { if (b & (1 << i)) a = dp[i][a]; } return a; } int jump2 (int a, int b) { for (int i = 18; i >= 0; i--) { if (b & (1 << i)) a = dp2[i][a]; } return a; } int minimum_jumps (int a, int b, int c, int d) { a++; c++; if (dep[a] < dep[c]) return -1; int l = 0, r = dep2[a], ans = -1; while (l <= r) { int mid = (l + r) >> 1; int u = jump2(a, mid); if (dep[u] < dep[c]) { r = mid - 1; } else { l = mid + 1; ans = mid; } } if (ans == -1) return -1; int t = jump2(a, ans); int v = jump(t, dep[t] - dep[c]); return ans + dep[t] - dep[c] + idx[c] - idx[v]; }
#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...