제출 #110980

#제출 시각아이디문제언어결과실행 시간메모리
110980square1001Jakarta Skyscrapers (APIO15_skyscraper)C++14
0 / 100
3 ms384 KiB
#include <set>
#include <ctime>
#include <deque>
#include <vector>
#include <iostream>
#include <algorithm>
#include <unordered_map>
using namespace std;
int N, M, B[30009], P[30009], dist[7500000], sep[7500000]; pair<int, int> e[22500000], ea[22500000], eb[30009];
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, eac = 0, ebc = 0;
	for(pair<int, int> i : s) {
		for(int j = i.first; j < N; j += i.second) {
			d[i.second * N + j] = cnt;
			if(j != i.first) {
				ea[eac++] = make_pair(cnt - 1, cnt);
				ea[eac++] = make_pair(cnt, cnt - 1);
			}
			ea[eac++] = make_pair(cnt, j);
			++cnt;
		}
	}
	for(int i = 0; i < M; ++i) {
		eb[ebc++] = make_pair(B[i], d[P[i] * N + B[i]]);
	}
	merge(ea, ea + eac, eb, eb + ebc, e);
	int E = eac + ebc;
	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;
	deque<int> que; que.push_back(B[0]);
	while(!que.empty()) {
		int u = que.front(); que.pop_front();
		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.push_front(tar);
			else dist[tar] = dist[u] + 1, que.push_back(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...