제출 #1265385

#제출 시각아이디문제언어결과실행 시간메모리
1265385canhnam357Jakarta Skyscrapers (APIO15_skyscraper)C++20
57 / 100
159 ms327680 KiB
#include <bits/stdc++.h>
using namespace std;
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n, m;
    cin >> n >> m;
    vector<vector<int>> p(n);
    int f, s, z;
    for (int i = 0; i < m; i++) {
        int b, c;
        cin >> b >> c;
        if (i == 0) f = b, s = c;
        if (i == 1) z = b;
        if (c < n) p[b].push_back(c);
    }
    for (int i = 0; i < n; i++) {
        sort(p[i].begin(), p[i].end());
        p[i].erase(unique(p[i].begin(), p[i].end()), p[i].end());
    }
    const int inf = 1e9;
    vector<vector<int>> d(n, vector<int>(n, inf));
    d[f][0] = 0;
    deque<pair<int, int>> dq;
    dq.emplace_front(f, 0);
    while (!dq.empty()) {
        auto [u, v] = dq[0];
        if (u == z) {
            cout << d[u][v];
            return 0;
        }
        dq.pop_front();
        if (!v) {
            for (int i : p[u]) {
                if (d[u][i] > d[u][v]) {
                    d[u][i] = d[u][v];
                    dq.emplace_front(u, i);
                }
            }
        }
        else {
            if (d[u][v] < d[u][0]) {
                d[u][0] = d[u][v];
                dq.emplace_front(u, 0);
            }
            if (u + v < n && d[u + v][v] > d[u][v] + 1) {
                d[u + v][v] = d[u][v] + 1;
                dq.emplace_back(u + v, v);
            }
            if (u - v >= 0 && d[u - v][v] > d[u][v] + 1) {
                d[u - v][v] = d[u][v] + 1;
                dq.emplace_back(u - v, v);
            }
        }
    }
    cout << -1;
    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...