제출 #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...