Submission #634974

#TimeUsernameProblemLanguageResultExecution timeMemory
634974ljubaJakarta Skyscrapers (APIO15_skyscraper)C++17
36 / 100
1088 ms7680 KiB
#include <bits/stdc++.h>
#include <exception>

using namespace std;

using ll = long long;

const int INF = 1e9 + 12;

const int K = 120;

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

    int n, m;
    cin >> n >> m;

    vector<pair<int, int>> v(m);

    for(auto &z : v) cin >> z.first >> z.second;

    priority_queue<pair<int, pair<int, int>>, vector<pair<int, pair<int, int>>>, greater<>> pq;
    pq.push({0, v[0]});

    set<pair<int, int>> visited;

    int ans = INF;

    vector<pair<int, int>> where[n];

    for(auto z : v) {
        where[z.first].push_back(z);
    }

    while(!pq.empty()) {
        auto best = pq.top();
        pq.pop();

        auto dist = best.first;
        auto current = best.second;

        if(visited.count(current)) continue;

        // cerr << dist << " " << current.first << " " << current.second << endl;

        if(current == v[1]) {
            ans = min(ans, dist);
            break;
        }

        visited.insert(current);
        // where[current.first].erase(current);

        if(current.second < K) {
            for(auto z : where[current.first]) {
                pq.push({dist, z});
            }

            if(current.second != 0) {
                vector<pair<int, int>> go;
                go.push_back({current.first - current.second, current.second});
                go.push_back({current.first + current.second, current.second});

                auto check = [&n](pair<int, int> x) {
                    return x.first >= 0 && x.first < n;
                };

                for(auto z : go) {
                    if(check(z)) {
                        pq.push({dist + 1, z});
                    }
                }
            }
        } else {
            for(int i = current.first % current.second; i < n; i += current.second) {
                int raz = abs(i - current.first);
                raz /= current.second;

                for(auto z : where[i]) {
                    pq.push({dist + raz, z});
                }
            }
        }
    }

    cout << ((ans >= INF) ? -1 : ans) << '\n';
}
#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...