結果
| 問題 | No.3616 WK vs AT vs MT vs SP |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-08-06 02:26:51 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.90.0) |
| 結果 |
AC
|
| 実行時間 | 140 ms / 2,000 ms |
| + 952µs | |
| コード長 | 1,665 bytes |
| 記録 | |
| コンパイル時間 | 2,181 ms |
| コンパイル使用メモリ | 344,692 KB |
| 実行使用メモリ | 41,116 KB |
| 最終ジャッジ日時 | 2026-08-06 13:40:18 |
| 合計ジャッジ時間 | 6,266 ms |
|
ジャッジサーバーID (参考情報) |
judge1_0 / judge2_0 |
(要ログイン)
| サブタスク | 配点 | 結果 |
|---|---|---|
| サンプル | 0 % | |
| 小課題1 | 8 % | AC * 9 |
| 小課題2 | 16 % | AC * 5 |
| 小課題3 | 20 % | AC * 10 |
| 小課題4 | 20 % | AC * 15 |
| 小課題5 | 20 % | AC * 15 |
| 小課題6 | 16 % | AC * 35 |
| 合計 | 2.5 * 100% = 250 点 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define rep(i, n) for(int i = 0; i < (int)(n); ++i)
ll dijkstra(const auto &G) {
int N = G.size();
vector<ll> d(N, 1e18);
priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<>> que;
d[0] = 0; que.push({d[0], 0});
while(!que.empty()) {
auto [dv, v] = que.top(); que.pop();
if(dv != d[v]) continue;
for(auto [nv, c] : G[v]) if(dv + c < d[nv]) {
d[nv] = dv + c;
que.push({d[nv], nv});
}
}
return d[N - 1];
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N, R; ll C;
cin >> N >> R >> C;
vector<ll> X(N), Y(N), Z(N), S(N);
rep(i, N) cin >> X[i];
rep(i, N) cin >> Y[i];
rep(i, N) cin >> Z[i];
rep(i, N) cin >> S[i];
vector<vector<pair<int, ll>>> G(N * 6 + 7);
auto add_edge = [&](int u1, int u2, int v1, int v2, ll c, bool f = 0) {
const int u = N * u1 + u2, v = N * v1 + v2;
G[u].push_back({v, c});
if(f) G[v].push_back({u, c});
};
rep(i, N) {
rep(k, 2) {
add_edge(3 * k + 0, i, 3 * k + 1, i, X[i]);
add_edge(3 * k + 0, i, 3 * k + 2, i, Y[i]);
add_edge(3 * k + 1, i, 3 * k + 2, i, Y[i]);
}
rep(k, 3) {
add_edge(k, i, 3 + k, i, Z[i]);
add_edge(3 + k, i, 6, k, S[i]);
add_edge(6, 3 + k, 3 + k, i, S[i]);
}
}
rep(k, 3) add_edge(6, k, 6, 3 + k, C);
rep(k, 6) add_edge(k, N - 1, 6, 6, 0);
while(R--) {
int U, V, W, A, M;
cin >> U >> V >> W >> A >> M, --U, --V;
A = min(A, W), M = min(M, A);
rep(k, 2) {
add_edge(3 * k + 0, U, 3 * k + 0, V, W, 1);
add_edge(3 * k + 1, U, 3 * k + 1, V, A, 1);
add_edge(3 * k + 2, U, 3 * k + 2, V, M, 1);
}
}
cout << dijkstra(G) << "\n";
}