結果

問題 No.3712 Urban Train
コンテスト
ユーザー sclara
提出日時 2026-08-10 09:15:22
言語 C++23
(gcc 15.3.0 + boost 1.92.0 + ACL)
コンパイル:
g++-15 -O2 -lm -std=c++23 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
RE  
実行時間 -
コード長 2,032 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 2,195 ms
コンパイル使用メモリ 342,480 KB
実行使用メモリ 18,432 KB
最終ジャッジ日時 2026-09-11 20:55:05
合計ジャッジ時間 5,480 ms
ジャッジサーバーID
(参考情報)
judge1_0 / judge2_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 8 RE * 31
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef std::pair<long long, long long> P;
typedef std::priority_queue<P, std::vector<P>, std::greater<P>> PQ;

template<typename T, typename U>
bool chmax(T& a, U b) {
    if (a < b) {
        a = b;
        return true;
    } else {
        return false;
    }
}

template<typename T, typename U>
bool chmin(T& a, U b) {
    if (a > b) {
        a = b;
        return true;
    } else {
        return false;
    }
}

int main()
{
    ll n, m;
    cin >> n >> m;
    if (n <= 1 || n > 100000) return 1;
    if (m <= 1 || m > 200000) return 1;
    vector<vector<P>> path(n);
    for (int i = 0; i < m; ++i) {
        ll u, v, w;
        cin >> u >> v >> w;
        if (u == v) return 1;
        if (1 > min(u, v) || n < max(u, v)) return 1;
        if (w < 1 || 1000000000 < w) return 1;
        --u, --v;
        path[u].push_back({v, w});
        path[v].push_back({u, w});
    }
    vector<ll> a(n), b(n), c(n);
    for (int i = 0; i < n; ++i) {
        cin >> a[i];
        if (a[i] < 1 || a[i] > 1000000000) return 1;
    }
    for (int i = 0; i < n; ++i) {
        cin >> b[i];
        if (b[i] <= 1 || a[i] > 100) return 1;
    }
    for (int i = 0; i < n; ++i) {
        cin >> c[i];
        if (c[i] < 1 || c[i] > 1000000000) return 1;
    }
    vector<ll> dist(n, 1e18);
    dist[0] = 1;
    PQ pq;
    pq.push({1, 0});
    while (!pq.empty()) {
        ll u = pq.top().second;
        ll ud = pq.top().first;
        pq.pop();
        if (ud > dist[u]) continue;
        for (auto [v, w] : path[u]) {
            if ((((ud + (a[u] - (ud % a[u])) % a[u])) / a[u]) % b[u]) {
                if (chmin(dist[v], ud + (a[u] - (ud % a[u])) % a[u] + w)) {
                    pq.push({dist[v], v});
                }
            } else {
                if (chmin(dist[v], ud + (a[u] - (ud % a[u])) % a[u] + w + min(c[u], a[u]))) {
                    pq.push({dist[v], v});
                }
            }
        }
    }
    cout << dist[n - 1] << endl;
}
0