답안 #210485

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
210485 2020-03-17T14:07:12 Z hanagasumi Railway Trip (JOI17_railway_trip) C++17
5 / 100
333 ms 524292 KB
#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});
	}

	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);
			if(l[now] >= l[i]) 
				break;
			now = pred[now];
		}
		now = i + 1;
		while(1) {
			if(now >= n) 
				break;
			g[i].pb(now);
			if(l[now] >= l[i]) 
				break;
			now = nxt[now];
		}
	}

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

	return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 376 KB Output is correct
2 Correct 5 ms 504 KB Output is correct
3 Correct 5 ms 408 KB Output is correct
4 Correct 5 ms 376 KB Output is correct
5 Correct 5 ms 376 KB Output is correct
6 Correct 5 ms 376 KB Output is correct
7 Correct 5 ms 376 KB Output is correct
8 Correct 5 ms 376 KB Output is correct
9 Correct 5 ms 376 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 40 ms 8312 KB Output is correct
2 Runtime error 333 ms 524292 KB Execution killed with signal 9 (could be triggered by violating memory limits)
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 317 ms 524292 KB Execution killed with signal 9 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 331 ms 524292 KB Execution killed with signal 9 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -