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