Submission #1233970

#TimeUsernameProblemLanguageResultExecution timeMemory
1233970AMel0nJakarta Skyscrapers (APIO15_skyscraper)C++20
100 / 100
64 ms6272 KiB
#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 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...