제출 #1138846

#제출 시각아이디문제언어결과실행 시간메모리
1138846am_aadvikRainforest Jumps (APIO21_jumps)C++20
37 / 100
4019 ms23908 KiB
#include <iostream>
#include <vector>
#include <cstring>
#include <queue>
#include<set>
#include<algorithm>
using namespace std;

vector<int> g[200005];
bool vis[200005], sub1 = 1; int n;
void con(int u, int v) {
	g[u].push_back(v);
}

void init(int tn, vector<int> a) {
	n = tn; set<int> s;
	vector<pair<int, int>> sa;
	for (int i = 0; i < n; ++i)
		sa.push_back({ a[i], i }), 
		sub1 &= (!i ? 1 : (a[i] > a[i - 1]));
	sort(sa.begin(), sa.end());
	for (int i = n - 1; i >= 0; --i) {
		if (!s.empty()) {
			auto it = s.lower_bound(sa[i].second);
			if (it != s.end()) con(sa[i].second, *it);
			if (it != s.begin()) con(sa[i].second, (*prev(it, 1)));
		}
		s.insert(sa[i].second);
	}
}

int minimum_jumps(int a, int b, int c, int d) {
	if (sub1) return c - b;
	queue<pair<int, int>> q;
	memset(vis, 0, sizeof(vis));
	for (int i = a; i <= b; ++i)
		q.push({ i, 0 }), vis[i] = 1;

	while (!q.empty()) {
		auto f = q.front(); q.pop();
		if ((f.first >= c) && (f.first <= d)) return f.second;
		for (auto x : g[f.first])
			if (!vis[x]) q.push({ x, f.second + 1 }), vis[x] = 1;
	}
	return -1;
}
#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...