Submission #119253

#TimeUsernameProblemLanguageResultExecution timeMemory
119253dolphingarlicJakarta Skyscrapers (APIO15_skyscraper)C++14
100 / 100
204 ms65636 KiB
#include <iostream>
#include <queue>
#include <set>
#include <vector>
using namespace std;
priority_queue<pair<int, int>> q1;
const int MAXN = 30010;
set<int> v1[MAXN];
vector<pair<int, int>> g[MAXN];
bool visited[MAXN];
int dp[MAXN];
int target;

int first, jump;
int main() {
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < m; i++) {
        int b, p;
        cin >> b >> p;
        if (i == 0) {
            first = b;
            jump = p;
        }
        if (i == 1) {
            target = b;
        }

        v1[b].insert(p);
    }
    for (int i = 0; i <= n; i++) {
        for (int x : v1[i]) {
            int b = i;
            int p = x;
            int count = 1;
            for (int j = b + p; j <= n; j += p) {
                // cout<<i<<" "<<j<<endl;
                if (v1[j].find(p) != v1[j].end()) {
                    g[b].push_back(make_pair(j, count));
                    break;
                }
                g[b].push_back(make_pair(j, count));
                count++;
            }
            count = 1;
            for (int j = b - p; j >= 0; j -= p) {
                if (v1[j].find(p) != v1[j].end()) {
                    g[b].push_back(make_pair(j, count));
                    break;
                }
                g[b].push_back(make_pair(j, count));
                count++;
            }
        }
    }
    q1.push(make_pair(0, first));
    for (int i = 0; i <= n; i++) {
        dp[i] = 1e9;
    }
    dp[first] = 0;

    while (!q1.empty()) {
        auto hold = q1.top();
        int skyscraper = hold.second;
        int dist = -1 * hold.first;

        q1.pop();
        if (skyscraper == target) {
            cout << dist << endl;
            return 0;
        }
        if (visited[skyscraper]) {
            continue;
        }
        visited[skyscraper] = true;
        for (auto x : g[skyscraper]) {
            int w = x.second;
            int to = x.first;
            if (dp[to] > dp[skyscraper] + w) {
                dp[to] = dp[skyscraper] + w;
                q1.push(make_pair(-1 * dp[to], to));
            }
        }
    }
    cout << -1 << endl;
}
#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...