結果
| 問題 |
No.614 壊れたキャンパス
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2017-12-14 01:28:22 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 207 ms / 2,000 ms |
| コード長 | 1,402 bytes |
| コンパイル時間 | 1,342 ms |
| コンパイル使用メモリ | 92,024 KB |
| 実行使用メモリ | 38,592 KB |
| 最終ジャッジ日時 | 2024-12-14 10:48:38 |
| 合計ジャッジ時間 | 4,405 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 20 |
ソースコード
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
using namespace std;
int main() {
int n, m, k, s, t;
cin >> n >> m >> k >> s >> t;
vector<int> a(m), b(m), c(m);
vector<vector<int>> g(n), gg(n);
g[0].push_back(s);
g[n - 1].push_back(t);
for (int i = 0; i < m; i++) {
scanf("%d %d %d", &a[i], &b[i], &c[i]);
g[a[i] - 1].push_back(b[i]);
g[a[i] ].push_back(c[i]);
gg[a[i] - 1].push_back(i);
}
vector<vector<long long>> dp(n);
for (int i = 0; i < n; i++) {
sort(g[i].begin(), g[i].end());
g[i].erase(unique(g[i].begin(), g[i].end()), g[i].end());
dp[i].resize(g[i].size(), 1e18);
}
auto index = [&](vector<int> &a, int v) { return lower_bound(a.begin(), a.end(), v) - a.begin(); };
int S = index(g[0], s);
int T = index(g[n - 1], t);
dp[0][S] = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j + 1 < g[i].size(); j++) {
dp[i][j + 1] = min(dp[i][j + 1], dp[i][j] + g[i][j + 1] - g[i][j]);
}
for (int j = (int)g[i].size() - 2; j >= 0; j--) {
dp[i][j] = min(dp[i][j], dp[i][j + 1] + g[i][j + 1] - g[i][j]);
}
for (int j : gg[i]) {
int u = index(g[i], b[j]);
int v = index(g[i + 1], c[j]);
dp[i + 1][v] = min(dp[i + 1][v], dp[i][u]);
}
}
if (dp[n - 1][T] >= 1e17) {
cout << -1 << endl;
} else {
cout << dp[n - 1][T] << endl;
}
}