Submission #1195431

#TimeUsernameProblemLanguageResultExecution timeMemory
1195431SarvarJakarta Skyscrapers (APIO15_skyscraper)C++20
0 / 100
1 ms1096 KiB
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 30005;

int N, M;
vector<pair<int, int>> doges; // (position, power)
vector<vector<int>> building(MAXN); // doges in each building
vector<vector<int>> visited; // visited[doge_index][position]
queue<tuple<int, int, int>> q; // (doge_index, position, steps)

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

    cin >> N >> M;
    doges.resize(M);
    visited.assign(M, vector<int>(N, -1));

    for (int i = 0; i < M; ++i) {
        int b, p;
        cin >> b >> p;
        doges[i] = {b, p};
        building[b].push_back(i);
    }

    // Start from doge 0
    q.emplace(0, doges[0].first, 0);
    visited[0][doges[0].first] = 0;

    while (!q.empty()) {
        auto [idx, pos, steps] = q.front();
        q.pop();

        // If reached doge 1
        if (idx == 1) {
            cout << steps << '\n';
            return 0;
        }

        int power = doges[idx].second;

        // Jump to the left
        for (int next = pos - power; next >= 0; next -= power) {
            if (visited[idx][next] != -1) break;
            visited[idx][next] = steps + 1;
            q.emplace(idx, next, steps + 1);
        }

        // Jump to the right
        for (int next = pos + power; next < N; next += power) {
            if (visited[idx][next] != -1) break;
            visited[idx][next] = steps + 1;
            q.emplace(idx, next, steps + 1);
        }

        // Pass message to other doges in the same building
        for (int other_idx : building[pos]) {
            if (visited[other_idx][pos] == -1) {
                visited[other_idx][pos] = steps + 1;
                q.emplace(other_idx, pos, steps + 1);
            }
        }

        // Clear the building to prevent redundant processing
        building[pos].clear();
    }

    // If doge 1 is unreachable
    cout << -1 << '\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...