#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define FOR(i,N) for(ll i = 0; i < N; i++)
#define all(x) (x).begin(), (x).end()
// #define F first
// #define S second
int N, M, start, endd;
unordered_set<int> B[30005]; // building -> power of doge inside
int vis[30005];
signed main() {
cin.tie(0); ios::sync_with_stdio(false);
cin >> N >> M;
fill(vis, vis+N, 1e9);
FOR(i, M) {
int b, p;
cin >> b >> p;
B[b].insert(p);
if (i == 0) start = b;
if (i == 1) endd = b;
}
priority_queue<pair<int,int>, vector<pair<int,int>>, greater<pair<int,int>>> pq;
pq.push({0, start});
vis[start] = 0;
while(pq.size()) {
auto [dist, u] = pq.top();
pq.pop();
// cout << dist << ' ' << u << ' '<< vis[u] << endl;
if (vis[u] != dist) continue;
if (u == endd) {
cout << dist;
return 0;
}
for(int dog: B[u]) {
for(int v = u - dog; v >= 0; v -= dog) {
if (dist + (u - v) / dog < vis[v]) {
pq.push({dist + (u - v) / dog, v});
vis[v] = dist + (u - v) / dog;
}
if (B[v].find(dog) != B[v].end()) break;
}
for(int v = u + dog; v < N; v += dog) {
if (dist + (v - u) / dog < vis[v]) {
pq.push({dist + (v - u) / dog, v});
vis[v] = dist + (v - u) / dog;
}
if (B[v].find(dog) != B[v].end()) break;
}
}
}
cout << -1;
}
# | 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... |