Submission #110988

#TimeUsernameProblemLanguageResultExecution timeMemory
110988square1001Jakarta Skyscrapers (APIO15_skyscraper)C++14
57 / 100
1088 ms103048 KiB
#include <set>
#include <ctime>
#include <vector>
#include <iostream>
#include <algorithm>
#include <unordered_map>
using namespace std;
int N, M, ql, qr, B[30009], P[30009], dist[7500000], sep[7500000], que[22500009]; pair<int, int> e[22500000];
int main() {
	cin.tie(0);
	ios_base::sync_with_stdio(false);
	cin >> N >> 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);
		}
	}
	unordered_map<int, int> d;
	int cnt = N, E = 0;
	for(pair<int, int> i : s) {
		for(int j = i.first; j < N; j += i.second) {
			d[i.second * N + j] = cnt++;
		}
	}
	for(int i = 0; i < M; ++i) {
		e[E++] = make_pair(B[i], d[P[i] * N + B[i]]);
	}
	sort(e, e + M);
	cnt = N;
	for(pair<int, int> i : s) {
		for(int j = i.first; j < N; j += i.second) {
			if(j != i.first) {
				e[E++] = make_pair(cnt - 1, cnt);
				e[E++] = make_pair(cnt, cnt - 1);
			}
			e[E++] = make_pair(cnt++, j);
		}
	}
	for(int i = 0; i < E; ++i) {
		sep[e[i].first + 1] = i + 1;
	}
	for(int i = 1; i <= sum; ++i) {
		sep[i] = max(sep[i], sep[i - 1]);
	}
	fill(dist, dist + N + sum, -1);
	dist[B[0]] = 0;
	que[qr++] = B[0];
	while(ql != qr) {
		int u = que[ql++];
		for(int i = sep[u]; i < sep[u + 1]; ++i) {
			int tar = e[i].second;
			if(dist[tar] != -1) continue;
			if(u < N || tar < N) dist[tar] = dist[u], que[--ql] = tar;
			else dist[tar] = dist[u] + 1, que[qr++] = tar;
		}
	}
	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...