Submission #1322086

#TimeUsernameProblemLanguageResultExecution timeMemory
1322086aaaaaaaaJakarta Skyscrapers (APIO15_skyscraper)C++20
100 / 100
704 ms112284 KiB
#include <bits/stdc++.h>
using namespace std;
const int mxN = 3e4 + 1;
const int inf = 1e9;

vector<int> pos[mxN];
int n, m, x, y;
bitset<mxN> vis[mxN];

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(nullptr); cout.tie(nullptr);
    cin >> n >> m;
    vector<int> d(m), s(m);
    for(int i = 0; i < m; ++i){
        cin >> d[i] >> s[i];
        if(i == 0) x = d[i], y = s[i];
        pos[d[i]].push_back(s[i]);
    }
    priority_queue<tuple<int, int, int>> pq;
    pq.push({0, x, y});
    vis[x][y] = 1;
    int ans = inf;
    while(pq.size()){
        auto [dist, id, mov] = pq.top();
        pq.pop();
        dist = -dist;
        if(id == d[1]){
            ans = min(ans, dist);
            continue;
        }
        for(auto it : pos[id]){
            if((id + it) <= (n - 1) && !vis[id + it][it]){
                vis[id + it][it] = 1;
                pq.push({-(dist + 1), id + it, it});
            }
            if((id - it) >= 0 && !vis[id - it][it]){
                vis[id - it][it] = 1;
                pq.push({-(dist + 1), id - it, it});
            }
        }
        if((id + mov) <= (n - 1) && !vis[id + mov][mov]){
            vis[id + mov][mov] = 1;
            pq.push({-(dist + 1), id + mov, mov});
        }
        if((id - mov) >= 0 && !vis[id - mov][mov]){
            vis[id - mov][mov] = 1;
            pq.push({-(dist + 1), id - mov, mov});
        }
    }
    if(ans == inf) cout << -1 << "\n";
    else cout << ans << "\n";
    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...