結果
| 問題 |
No.2764 Warp Drive Spacecraft
|
| コンテスト | |
| ユーザー |
rniya
|
| 提出日時 | 2024-05-17 22:42:11 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,664 bytes |
| コンパイル時間 | 3,395 ms |
| コンパイル使用メモリ | 268,108 KB |
| 実行使用メモリ | 26,472 KB |
| 最終ジャッジ日時 | 2024-12-20 14:45:15 |
| 合計ジャッジ時間 | 10,805 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 WA * 1 |
| other | AC * 14 WA * 21 |
ソースコード
#include <bits/stdc++.h>
#ifdef LOCAL
#include <debug.hpp>
#else
#define debug(...) void(0)
#endif
template <class T> std::istream& operator>>(std::istream& is, std::vector<T>& v) {
for (auto& e : v) {
is >> e;
}
return is;
}
template <class T> std::ostream& operator<<(std::ostream& os, const std::vector<T>& v) {
for (std::string_view sep = ""; const auto& e : v) {
os << std::exchange(sep, " ") << e;
}
return os;
}
template <class T, class U = T> bool chmin(T& x, U&& y) {
return y < x and (x = std::forward<U>(y), true);
}
template <class T, class U = T> bool chmax(T& x, U&& y) {
return x < y and (x = std::forward<U>(y), true);
}
template <class T> void mkuni(std::vector<T>& v) {
std::ranges::sort(v);
auto result = std::ranges::unique(v);
v.erase(result.begin(), result.end());
}
template <class T> int lwb(const std::vector<T>& v, const T& x) {
return std::distance(v.begin(), std::ranges::lower_bound(v, x));
}
struct Line {
mutable long long k, m, p;
bool operator<(const Line& o) const { return k < o.k; }
bool operator<(long long x) const { return p < x; }
};
template <bool isMin = true> struct LineContainer : std::multiset<Line, std::less<>> {
// (for doubles, use inf = 1/.0, div(a,b) = a/b)
const long long inf = LLONG_MAX / 2;
long long div(long long a, long long b) { // floored division
return a / b - ((a ^ b) < 0 && a % b);
}
bool isect(iterator x, iterator y) {
if (y == end()) {
x->p = inf;
return false;
}
if (x->k == y->k)
x->p = x->m > y->m ? inf : -inf;
else
x->p = div(y->m - x->m, x->k - y->k);
return x->p >= y->p;
}
void add(long long k, long long m) {
if (isMin) k = -k, m = -m;
auto z = insert({k, m, 0}), y = z++, x = y;
while (isect(y, z)) z = erase(z);
if (x != begin() && isect(--x, y)) isect(x, y = erase(y));
while ((y = x) != begin() && (--x)->p >= y->p) isect(x, erase(y));
}
long long query(long long x) {
assert(!empty());
auto l = *lower_bound(x);
long long s = 1;
if (isMin) s = -1;
return s * (l.k * x + l.m);
}
};
using ll = long long;
using namespace std;
constexpr ll INF = 4e18;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout << fixed << setprecision(15);
int N, M;
cin >> N >> M;
vector<ll> W(N);
cin >> W;
vector<vector<pair<int, ll>>> G(N);
for (; M--;) {
int U, V;
ll T;
cin >> U >> V >> T;
U--, V--;
G[U].emplace_back(V, T);
G[V].emplace_back(U, T);
}
auto calc = [&](int s) {
vector<ll> dp(N, INF);
priority_queue<pair<ll, int>> pq;
dp[s] = 0;
pq.emplace(-dp[s], s);
while (not pq.empty()) {
auto [val, v] = pq.top();
pq.pop();
val *= -1;
if (dp[v] != val) continue;
for (auto [u, cost] : G[v]) {
if (chmin(dp[u], val + cost)) {
pq.emplace(-dp[u], u);
}
}
}
return dp;
};
auto f = calc(0), g = calc(N - 1);
ll mini = ranges::min(W), ans = f[N - 1];
ll min_F = INF, min_G = INF;
LineContainer lc;
for (int i = 0; i < N; i++) {
chmin(min_F, f[i] + W[i] * mini);
chmin(min_G, g[i] + W[i] * mini);
lc.add(W[i], g[i]);
}
chmin(ans, min_F + min_G);
for (int i = 0; i < N; i++) chmin(ans, f[i] + lc.query(W[i]));
cout << ans << '\n';
return 0;
}
rniya