Submission #1289289

#TimeUsernameProblemLanguageResultExecution timeMemory
1289289harryleeeJakarta Skyscrapers (APIO15_skyscraper)C++20
100 / 100
74 ms9960 KiB
#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 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...