This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |