제출 #1233778

#제출 시각아이디문제언어결과실행 시간메모리
1233778AMel0nJakarta Skyscrapers (APIO15_skyscraper)C++20
100 / 100
145 ms65416 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


signed main() {
    cin.tie(0); ios::sync_with_stdio(false);
    int N, M;
    cin >> N >> M;

    int st, end;
    vector<unordered_set<int>> B(N); // building -> power of doge inside
    vector<vector<pair<int,int>>> adj(N);

    FOR(i, M) {
        int b, p;
        cin >> b >> p;
        B[b].insert(p);
        if (i == 0) st = b;
        if (i == 1) end = b;
    }

    // first 2 loops are O(M), 3 loops are O(NM)
    FOR(u, N) {
        for(int dog: B[u]) {
            for(int v = u - dog; v >= 0; v -= dog) {
                adj[u].push_back({v, (u - v) / dog});
                if (B[v].find(dog) != B[v].end()) break;
            }
            for(int v = u + dog; v < N; v += dog) {
                adj[u].push_back({v, (v - u) / dog});
                if (B[v].find(dog) != B[v].end()) break;
            }
        }
    }

    priority_queue<pair<int,int>, vector<pair<int,int>>, greater<pair<int,int>>> pq;
    vector<int> vis(N, 1e9);
    pq.push({0, st}); 

    while(pq.size()) {
        auto [dist, u] = pq.top();
        pq.pop();
        if (u == end) {cout << dist; return 0;}
        for(auto [v, j]: adj[u]) {
            if (dist+j < vis[v]) {
                pq.push({dist+j, v});
                vis[v] = dist+j;
            }
        }
    }
    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...