Submission #375931

#TimeUsernameProblemLanguageResultExecution timeMemory
375931KoDJakarta Skyscrapers (APIO15_skyscraper)C++17
100 / 100
834 ms22628 KiB
#include <bits/stdc++.h>

template <class T>
using Vec = std::vector<T>;

template <class T>
using Heap = std::priority_queue<T, Vec<T>, std::greater<T>>;

constexpr int INF = std::numeric_limits<int>::max() / 2;
constexpr int SQRT = 150;

int main() {
    int N, M;
    std::cin >> N >> M;
    Vec<int> B(M), P(M);
    Vec<Vec<int>> lives(N);
    for (int i = 0; i < M; ++i) {
        std::cin >> B[i] >> P[i];
        lives[B[i]].push_back(P[i]);
    }
    for (int i = 0; i < N; ++i) {
        std::sort(lives[i].begin(), lives[i].end());
        lives[i].erase(std::unique(lives[i].begin(), lives[i].end()), lives[i].end());
    }
    Vec<std::array<int, SQRT + 1>> dist(N);
    for (auto &arr: dist) {
        arr.fill(INF);
    }
    Heap<std::tuple<int, int, int>> heap;
    const auto push = [&](const int u, const int k, const int d) {
        if (dist[u][k] > d) {
            dist[u][k] = d;
            heap.emplace(d, u, k);
        }
    };
    push(B[0], 0, 0);
    while (!heap.empty()) {
        const auto [d, u, k] = heap.top();
        heap.pop();
        if (dist[u][k] < d) {
            continue;
        }
        if (k == 0) {
            for (const auto p: lives[u]) {
                if (p <= SQRT) {
                    push(u, p, d);
                }
                else {
                    for (int i = 1; u + i * p < N; ++i) {
                        push(u + i * p, 0, d + i);
                    }
                    for (int i = 1; u - i * p >= 0; ++i) {
                        push(u - i * p, 0, d + i);
                    }
                }
            }
        }
        else {
            push(u, 0, d);
            if (u + k < N) {
                push(u + k, k, d + 1);
            }
            if (u - k >= 0) {
                push(u - k, k, d + 1);
            }
        }
    }
    const auto ans = dist[B[1]][0];
    if (ans == INF) {
        std::cout << -1 << '\n';
    }
    else {
        std::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...