제출 #925009

#제출 시각아이디문제언어결과실행 시간메모리
925009TAhmed33밀림 점프 (APIO21_jumps)C++17
33 / 100
4081 ms5240 KiB
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 25;
int a[MAXN], nxt[MAXN], prv[MAXN];
int n; 
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();
	}
	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();
	}
}
int minimum_jumps (int a, int b, int c, int d) {
	a++; b++; c++; d++;
	int dist[n + 1];
	for (int i = 1; i <= n; i++) dist[i] = n + 1;
	queue <int> cur;
	for (int i = a; i <= b; i++) {
		dist[i] = 0;
		cur.push(i);
	}
	while (!cur.empty()) {
		auto k = cur.front();
		cur.pop();
		if (nxt[k] != -1) {
			if (dist[nxt[k]] == n + 1) {
				dist[nxt[k]] = dist[k] + 1;
				cur.push(nxt[k]);
			}
		}
		if (prv[k] != -1) {
			if (dist[prv[k]] == n + 1) {
				dist[prv[k]] = dist[k] + 1;
				cur.push(prv[k]);
			}
		}
	}
	int mn = n + 1;
	for (int i = c; i <= d; i++) mn = min(mn, dist[i]);
	if (mn == n + 1) return -1;
	return mn;
}
	
#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...