Submission #311131

#TimeUsernameProblemLanguageResultExecution timeMemory
311131lohachoJakarta Skyscrapers (APIO15_skyscraper)C++14
100 / 100
122 ms6000 KiB
#include <bits/stdc++.h>

using namespace std;

using LL = long long;
const int MOD = (int)1e9 + 7;
const int NS = (int)3e4 + 4;
int N, M;
int B[NS], P[NS];
int far[NS], chk[NS];
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
vector<int> put[NS];

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> N >> M;
    for(int i = 0; i < M; ++i){
        cin >> B[i] >> P[i];
        put[B[i]].push_back(P[i]);
    }
    for(int i = 0; i < N; ++i){
        sort(put[i].begin(), put[i].end());
        put[i].erase(unique(put[i].begin(), put[i].end()), put[i].end());
        far[i] = MOD;
    }
    far[B[0]] = 0;
    pq.push({0, B[0]});
    while(!pq.empty()){
        while(!pq.empty() && chk[pq.top().second]){
            pq.pop();
        }
        if(pq.empty()){
            break;
        }
        int now = pq.top().second; pq.pop();
        chk[now] = 1;
        for(auto&jump:put[now]){
            for(int mov = 1; now + mov * jump < N; ++mov){
                int nxt = now + mov * jump;
                if(far[now] + mov < far[nxt]){
                    far[nxt] = far[now] + mov;
                    pq.push({far[nxt], nxt});
                }
                int pos = lower_bound(put[nxt].begin(), put[nxt].end(), jump) - put[nxt].begin();
                if(pos < (int)put[nxt].size() && put[nxt][pos] == jump){
                    break;
                }
            }
        }
        for(auto&jump:put[now]){
            for(int mov = 1; now - mov * jump >= 0; ++mov){
                int nxt = now - mov * jump;
                if(far[now] + mov < far[nxt]){
                    far[nxt] = far[now] + mov;
                    pq.push({far[nxt], nxt});
                }
                int pos = lower_bound(put[nxt].begin(), put[nxt].end(), jump) - put[nxt].begin();
                if(pos < (int)put[nxt].size() && put[nxt][pos] == jump){
                    break;
                }
            }
        }
    }
    if(far[B[1]] == MOD){
        cout << -1;
    }
    else{
        cout << far[B[1]];
    }
    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...