結果
| 問題 |
No.1898 Battle and Exchange
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2022-04-08 21:52:51 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 682 ms / 5,000 ms |
| コード長 | 2,030 bytes |
| コンパイル時間 | 3,243 ms |
| コンパイル使用メモリ | 269,264 KB |
| 実行使用メモリ | 11,548 KB |
| 最終ジャッジ日時 | 2024-11-28 12:34:43 |
| 合計ジャッジ時間 | 20,897 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 58 |
ソースコード
#include <bits/stdc++.h>
#include <atcoder/math>
using namespace std;
int main()
{
int N, M;
cin >> N >> M;
vector<vector<int>> V(N);
for (int i = 0; i < M; i++)
{
int u, v;
scanf("%d%d", &u, &v);
V[u - 1].push_back(v - 1);
V[v - 1].push_back(u - 1);
}
vector<tuple<int, int, int>> ABC(N);
for (auto &[a, b, c] : ABC)
cin >> a >> b >> c;
auto can = [&](int x)
{
// at least, can you go out?
{
auto [a, b, c] = ABC[0];
if (a + b + c >= x + 2)
return false;
int nx = x + max({a, b, c}) + 1;
int minv = 1e9;
for (auto u : V[0])
{
auto [a, b, c] = ABC[u];
minv = min(minv, a + b + c);
}
if (minv >= nx)
return false;
}
tuple<int, int, int> cur = {x, 1, 1};
using pii = pair<int, int>;
priority_queue<pii, vector<pii>, greater<pii>> Q;
vector<bool> vis(N, 0);
auto [a, b, c] = ABC[0];
Q.emplace(a + b + c, 0);
while (!Q.empty())
{
auto [w, u] = Q.top();
Q.pop();
if (vis[u])
continue;
vis[u] = true;
auto [ca, cb, cc] = cur;
if (w >= ca + cb + cc)
return false;
if (u == N - 1)
return true;
auto [xx, yy, zz] = ABC[u];
int cs[6] = {ca, cb, cc, xx, yy, zz};
sort(cs, cs + 6);
cur = {cs[5], cs[4], cs[3]};
for (auto x : V[u])
{
auto [a, b, c] = ABC[x];
Q.emplace(a + b + c, x);
}
}
return false;
};
int ng = 0;
int ok = 300'000'000;
while (ng + 1 != ok)
{
int mi = (ng + ok) / 2;
if (can(mi))
ok = mi;
else
ng = mi;
}
cout << ok << " " << 1 << " " << 1 << endl;
}