제출 #925013

#제출 시각아이디문제언어결과실행 시간메모리
925013TAhmed33밀림 점프 (APIO21_jumps)C++17
0 / 100
4 ms21336 KiB
#include <bits/stdc++.h> using namespace std; const int MAXN = 2e5 + 25; int a[MAXN], prv[MAXN], n; vector <int> adj[MAXN]; int dep[MAXN], dp[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(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 minimum_jumps (int a, int b, int c, int d) { if (dep[a] < dep[c]) return -1; int u = jump(a, dep[a] - dep[c]); return dep[a] - dep[c] + idx[c] - idx[u]; }
#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...