제출 #110976

#제출 시각아이디문제언어결과실행 시간메모리
110976square1001Jakarta Skyscrapers (APIO15_skyscraper)C++14
10 / 100
5 ms384 KiB
#include <set>
#include <deque>
#include <vector>
#include <iostream>
#include <algorithm>
#include <unordered_map>
using namespace std;
int main() {
	int N, M;
	cin >> N >> M;
	vector<int> B(M), P(M);
	for(int i = 0; i < M; ++i) {
		cin >> B[i] >> P[i];
	}
	int sum = 0;
	set<pair<int, int> > s;
	for(int i = 0; i < M; ++i) {
		pair<int, int> u = make_pair(B[i] % P[i], P[i]);
		if(s.find(u) == s.end()) {
			sum += ((N - 1) - B[i] % P[i] + P[i]) / P[i];
			s.insert(u);
		}
	}
	vector<vector<int> > G(N + sum);
	unordered_map<int, int> d;
	int cnt = N;
	for(pair<int, int> i : s) {
		for(int j = i.first; j < N; j += i.second) {
			d[i.second * N + j] = cnt;
			G[cnt].push_back(j);
			if(j != i.first) {
				G[cnt].push_back(cnt - 1);
				G[cnt - 1].push_back(cnt);
			}
			++cnt;
		}
	}
	for(int i = 0; i < M; ++i) {
		G[B[i]].push_back(d[P[i] * N + B[i]]);
	}
	vector<int> dist(N + sum, -1); dist[0] = 0;
	deque<int> que; que.push_back(0);
	while(!que.empty()) {
		int u = que.front(); que.pop_front();
		for(int i : G[u]) {
			if(dist[i] != -1) continue;
			if(u < N || i < N) dist[i] = dist[u], que.push_front(i);
			else dist[i] = dist[u] + 1, que.push_back(i);
		}
	}
	cout << dist[B[1]] << endl;
	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...
#Verdict Execution timeMemoryGrader output
Fetching results...