This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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[B[0]] = 0;
deque<int> que; que.push_back(B[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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |