Submission #634481

#TimeUsernameProblemLanguageResultExecution timeMemory
634481ljubaJakarta Skyscrapers (APIO15_skyscraper)C++17
57 / 100
1093 ms46176 KiB
#include <bits/stdc++.h>

using namespace std;

using ll = long long;

const int INF = 1e9 + 12;

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

    vector<vector<pair<int, int>>> kud(n);

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

    map<pair<int, int>, int> dist;
    dist[v[0]] = 0;

    deque<pair<int, int>> q;
    q.push_back(v[0]);

    int ans = INF;

    while(!q.empty()) {
        auto tren = q.front();
        q.pop_front();

        // cerr << tren.first << " " << tren.second << endl;

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

        for(auto x : kud[tren.first]) {
            if(!dist.count(x)) {
                dist[x] = dist[tren];
                q.push_front(x);
            }
        }

        kud[tren.first].clear();

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

        pair<int, int> levo{tren.first - tren.second, tren.second};
        pair<int, int> desno{tren.first + tren.second, tren.second};

        if(!dist.count(levo) && check(levo)) {
            dist[levo] = dist[tren] + 1;
            q.push_back(levo);
        }

        if(!dist.count(desno) && check(desno)) {
            dist[desno] = dist[tren] + 1;
            q.push_back(desno);
        }
    }

    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...