제출 #1195274

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

int32_t 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];
    }

    vector<vector<int>> doges_by_pos(N);
    for(int i = 0; i < M; i++){
        doges_by_pos[B[i]].push_back(i);
    }

    int tot = N + M;
    vector<int> dist(tot, INF);
    deque<int> dq;

    dist[N + 0] = 0;
    dq.push_back(N + 0);

    vector<bool> visited_pos(N, false); // har bir pozitsiyani faqat bir marta ishlash

    while(!dq.empty()){
        int u = dq.front(); dq.pop_front();

        if(u >= N){
            int j = u - N;
            int b = B[j], p = P[j];
            for(int d = -1; d <= 1; d += 2){
                int nb = b + d * p;
                if(nb >= 0 && nb < N && dist[nb] > dist[u] + 1){
                    dist[nb] = dist[u] + 1;
                    dq.push_back(nb);
                }
            }
        } else {
            int b = u;
            if(visited_pos[b]) continue; // faqat bir marta uzatamiz
            visited_pos[b] = true;
            for(int j : doges_by_pos[b]){
                int v = N + j;
                if(dist[v] > dist[b]){
                    dist[v] = dist[b];
                    dq.push_front(v);
                }
            }
        }
    }

    int ans = dist[N + 1];
    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...