이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "jumps.h"
#include <vector>
#include<bits/stdc++.h>
using namespace std;
const int MxN = 2e5 + 5, K = 19;
int n, rt, t, h[MxN], l[MxN], r[MxN], tin[MxN], tout[MxN], dep[MxN], dp[K][MxN];
void dfs (int cur, int par, int parl, int parr) {
tin[cur] = ++t; dep[cur] = dep[par] + 1; dp[0][cur] = (dep[parl] < dep[parr] ? parl : parr);
if (l[cur]) dfs(l[cur], cur, parl, cur);
if (r[cur]) dfs(r[cur], cur, cur, parr);
tout[cur] = t;
}
void init(int N, std::vector<int> H) {
n = N;
for (int i = 1; i <= n; i++) h[i] = H[i - 1];
stack<int> st;
for (int i = 1; i <= n; i++) {
while (!st.empty() && h[i] > h[st.top()]) l[i] = st.top(), st.pop();
if (!st.empty()) r[st.top()] = i;
else rt = i;
st.emplace(i);
}
dfs(rt, 0, 0, 0);
for (int i = 1; i < K; i++) {
for (int j = 1; j <= n; j++) dp[i][j] = dp[i - 1][dp[i - 1][j]];
}
}
int minimum_jumps(int A, int B, int C, int D) {
int ans = 0;
int st = A + 1, ed = C + 1;
if (tin[ed] > tin[st] || tout[st] > tout[ed]) return -1;
for (int i = K - 1; i >= 0; i--) {
if (dep[dp[i][st]] >= dep[ed]) st = dp[i][st], ans += (1 << i);
}
ans += dep[st] - dep[ed];
return ans;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |