#include<bits/stdc++.h>
using namespace std;
const int maxn = 3e4, block = 170;
int n, m;
vector<int> adj[maxn];
int dis[maxn], st, en;
bool vis[maxn][block];
inline int dijkstra(){
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
for (int i = 0; i < n; ++i) dis[i] = 1e9;
memset(vis, false, sizeof(vis));
dis[st] = 0;
pq.push({0, st});
while(!pq.empty()){
int u = pq.top().second, cur_dis = pq.top().first;
pq.pop();
if (cur_dis != dis[u]) continue;
for (int v : adj[u]){
for (int i = u + v, step = 1; i < n; i += v, step++){
if (cur_dis + step < dis[i]){
dis[i] = cur_dis + step;
pq.push({dis[i], i});
}
if (v < block){
if (vis[i][v]) break;
vis[i][v] = true;
}
}
for (int i = u - v, step = 1; i >= 0; i -= v, step++){
if (cur_dis + step < dis[i]){
dis[i] = cur_dis + step;
pq.push({dis[i], i});
}
if (v < block){
if (vis[i][v]) break;
vis[i][v] = true;
}
}
}
}
if (dis[en] == 1e9) return -1;
return dis[en];
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
for (int i = 0; i < m; ++i){
int pos, jump; cin >> pos >> jump;
adj[pos].push_back(jump);
if (i == 0) st = pos;
if (i == 1) en = pos;
}
for (int i = 0; i < n; ++i){
sort(adj[i].begin(), adj[i].end());
adj[i].erase(unique(adj[i].begin(), adj[i].end()), adj[i].end());
}
cout << dijkstra();
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... |