제출 #1195296

#제출 시각아이디문제언어결과실행 시간메모리
1195296SarvarJakarta Skyscrapers (APIO15_skyscraper)C++20
0 / 100
0 ms328 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll INF = (ll)1e18;

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    int N, M;
    cin >> N >> M;
    vector<int> B(M), P(M);
    for(int i=0; i<M; i++) cin >> B[i] >> P[i];

    // 1) Collect unique powers <=√N and >√N separately:
    int S = sqrt(N);
    vector<vector<int>> powers(N);
    for(int i=0;i<M;i++){
        powers[ B[i] ].push_back(P[i]);
    }
    // 2) Assign IDs:
    //    - pos nodes: [0..N-1]
    //    - state nodes: subsequent
    int V = N;
    vector<unordered_map<int,int>> id_state(N);
    for(int b=0;b<N;b++){
        sort(powers[b].begin(), powers[b].end());
        powers[b].erase(unique(powers[b].begin(), powers[b].end()), powers[b].end());
        for(int p: powers[b]){
            id_state[b][p] = V++;
        }
    }

    // 3) Build graph
    vector<vector<pair<int,int>>> adj(V);
    auto addEdge = [&](int u,int v,int w){
        adj[u].emplace_back(v,w);
    };

    for(int b=0;b<N;b++){
        for(int p: powers[b]){
            int u = id_state[b][p];
            // jump left/right
            int nb = b + p;
            if(nb<N) addEdge(u, id_state[nb][p], 1);
            nb = b - p;
            if(nb>=0) addEdge(u, id_state[nb][p], 1);
            // to dummy(b)
            addEdge(u, b, 1);
        }
        // from dummy(b) to each (b,p)
        for(int p: powers[b]){
            addEdge(b, id_state[b][p], 0);
        }
    }

    // 4) Dijkstra
    vector<ll> dist(V, INF);
    priority_queue<pair<ll,int>, vector<pair<ll,int>>, greater<>> pq;
    int start = id_state[B[0]][P[0]];
    int target = id_state[B[1]][P[1]];
    dist[start] = 0;
    pq.push({0, start});
    while(!pq.empty()){
        auto [d,u] = pq.top(); pq.pop();
        if(d > dist[u]) continue;
        for(auto &e: adj[u]){
            int v = e.first, w = e.second;
            if(dist[v] > d + w){
                dist[v] = d + w;
                pq.push({dist[v], v});
            }
        }
    }

    ll ans = dist[target];
    cout << (ans==INF? -1 : 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...