제출 #210510

#제출 시각아이디문제언어결과실행 시간메모리
210510hanagasumiRailway Trip (JOI17_railway_trip)C++17
20 / 100
2094 ms16496 KiB
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <deque>
#include <map>
#include <set>
#include <complex>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <random>
#include <chrono>

#define ft first
#define sc second
#define pb push_back
#define len(v) (int)v.size()
#define int ll

using namespace std;
typedef long long ll;
typedef long double ld;

int inf = 1e9 + 100;

signed main() {
	#ifdef PC
		freopen("in.txt", "r", stdin);
		freopen("out.txt", "w", stdout);
	#endif	
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	int n, k, q;
	cin >> n >> k >> q;
	vector<int> l(n);
	vector<vector<int>> g(n);
	for (int i = 0; i < n; i++) {
		cin >> l[i];
	}

	vector<int> pred(n, -1);
	vector<int> nxt(n, n);
	vector<pair<int, int>> have;
	for (int i = 0; i < n; i++) {
		while(len(have) > 0 && have.back().ft <= l[i]) 
			have.pop_back();
		if(len(have) > 0) 
			pred[i] = have.back().sc;
		have.pb({l[i], i});
	}
	have.clear();
	for (int i = n - 1; i >= 0; i--) {
		while(len(have) > 0 && have.back().ft <= l[i]) 
			have.pop_back();
		if(len(have) > 0)
			nxt[i] = have.back().sc;
		have.pb({l[i], i});
	}

	int cnt = 0;
	for (int i = 0; i < n; i++) {
		if(i < n - 1) 
			g[i].pb(i + 1);
		int now = i - 1;
		while(1) {
			if(now < 0) 
				break;
			g[i].pb(now);
			cnt++;
			if(l[now] >= l[i]) 
				break;
			now = pred[now];
		}
		now = i + 1;
		while(1) {
			if(now >= n) 
				break;
			g[i].pb(now);
			cnt++;
			if(l[now] >= l[i]) 
				break;
			now = nxt[now];
		}
	}
	if(cnt > 5 * n) 
		return -1;

	for (int i = 0; i < q; i++) {		
		int a, b;
		cin >> a >> b;
		a--, b--;

		unordered_map<int, int> dst;
		dst[a] = 0;
		deque<int> q;
		q.pb(a);
		while(len(q) > 0) {
			if(dst.count(b))
				break;
			auto now = q.front();
			q.pop_front();
			for (auto x : g[now]) {
				if(dst.count(b))
					break;
				if(dst.count(x)) 
					continue;
				dst[x] = dst[now] + 1;
				q.pb(x);
			}
		}
		cout << dst[b] - 1 << '\n';
	}

	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...