제출 #1357236

#제출 시각아이디문제언어결과실행 시간메모리
1357236crispxxJakarta Skyscrapers (APIO15_skyscraper)C++20
57 / 100
302 ms327680 KiB
#include <bits/stdc++.h>

using namespace std;

#define nl '\n'

using ll = long long;

const int inf = 1e9 + 5;

bool chmin(int &a, const int &b) {
	return a > b ? a = b, true : false;
}

const int B = 180;

void solve() {
	int n, m; cin >> n >> m;
	
	vector<int> b(m), p(m);
	
	vector adj(n, vector(B, vector<array<int, 3>>()));
	
	for(int i = 0; i < m; i++) {
		cin >> b[i] >> p[i];
		
		if(p[i] < B) {
			adj[b[i]][0].push_back({b[i], p[i], 0});	
		} else {
			for(int j = b[i], cur = 0; j < n; j += p[i], cur++) {
				adj[b[i]][0].push_back({j, 0, cur});
			}
			for(int j = b[i], cur = 0; j >= 0; j -= p[i], cur++) {
				adj[b[i]][0].push_back({j, 0, cur});
			}
		}
	}
	
	for(int i = 0; i < n; i++) {
		for(int j = 1; j < B; j++) {
			adj[i][j].push_back({i, 0, 0});	
			if(i + j < n) adj[i][j].push_back({i + j, j, 1});
			if(i - j >= 0) adj[i][j].push_back({i - j, j, 1});
		}
	}
	
	// (position, 0) = (position)
	
	vector d(n, vector(B, inf));
	
	d[b[0]][0] = 0;
	
	priority_queue<array<int, 3>, vector<array<int, 3>>, greater<>> pq;
	
	pq.push({0, b[0], 0});
	
	while(!pq.empty()) {
		auto [d_v, pos, pw] = pq.top();
		pq.pop();
		
		// cout << d_v << ' ' << pos << ' ' << pw << nl;
		
		if(d_v != d[pos][pw]) continue;
		
		for(auto [npos, npw, w] : adj[pos][pw]) {
			if(chmin(d[npos][npw], d[pos][pw] + w)) {
				pq.push({d[npos][npw], npos, npw});
			}
		}
	}
	
	int ans = d[b[1]][0];
	
	if(ans == inf) ans = -1;
	
	cout << ans << nl;
}

signed main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	
	solve();
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…