QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#564503 | #5145. Shortest Path | nhuang685 | WA | 769ms | 192856kb | C++23 | 11.1kb | 2024-09-15 08:18:09 | 2024-09-15 08:18:09 |
Judging History
answer
/**
* @author n685
* @brief
* @date 2024-09-14 17:58:33
*
*
*/
#include "bits/stdc++.h"
#ifdef LOCAL
#include "dd/debug.h"
#else
#define dbg(...) 42
#define dbg_proj(...) 420
#define dbg_rproj(...) 420420
void nline() {}
void bar() {}
void start_clock() {}
void end_clock() {}
#endif
namespace rs = std::ranges;
namespace rv = std::views;
template <class T> constexpr T INF = T{};
template <std::floating_point T>
constexpr T INF<T> = std::numeric_limits<T>::infinity();
template <> constexpr int INF<int> = 0x3f3f3f3f; // 1061109567
template <>
constexpr int64_t INF<int64_t> = 0x3f3f3f3f3f3f3f3f; // 4557430888798830399
template <class T> constexpr std::pair<T, T> ex_eucl(T a, T b) {
if (a < b) {
auto [x, y] = ex_eucl(b, a);
return {y, x};
}
if (b == 0) {
assert(a == 1);
return {1, 0};
}
auto [x, y] = ex_eucl(b, a % b);
return {y, x - (a / b) * y};
}
template <class Md, class V = int64_t>
requires std::signed_integral<std::decay_t<decltype(Md::value)>>
struct Mod {
using T = std::decay_t<decltype(Md::value)>;
T val = 0;
static constexpr T normalize(std::integral auto val) {
using U = decltype(Md::value + val);
U uval = static_cast<U>(val);
U umd = static_cast<U>(Md::value);
if (uval <= -umd || umd <= uval) {
uval %= umd;
}
if (val < 0) {
uval += umd;
}
return static_cast<T>(uval);
}
constexpr Mod() : val(0) {}
constexpr explicit Mod(std::integral auto _val) : val(normalize(_val)) {}
static inline const Mod ZERO = Mod(0);
static inline const Mod ONE = Mod(1);
static inline const Mod TWO = Mod(2);
// addition
constexpr Mod &operator+=(Mod b) {
val += b.val;
if (val >= Md::value) {
val -= Md::value;
}
return *this;
}
friend constexpr Mod operator+(Mod a, Mod b) { return a += b; }
constexpr Mod &operator++() { return *this += Mod(1); }
constexpr Mod operator++(int) {
Mod res = *this;
++(*this);
return res;
}
// subtraction
constexpr Mod &operator-=(Mod b) {
val -= b.val;
if (val < 0) {
val += Md::value;
}
return *this;
}
friend constexpr Mod operator-(Mod a, Mod b) { return a -= b; }
constexpr Mod &operator--() { return *this -= Mod(1); }
constexpr Mod operator--(int) {
Mod res = *this;
--(*this);
return res;
}
// negation
constexpr Mod operator-() const { return Mod(-val); }
// multiplication
constexpr Mod &operator*=(Mod b) {
val = static_cast<T>(static_cast<V>(val) * b.val % Md::value);
return *this;
}
friend constexpr Mod operator*(Mod a, Mod b) { return a *= b; }
constexpr Mod binpow(std::integral auto b) const {
Mod res = Mod(1), a = *this;
while (b > 0) {
if (b % 2 == 1) {
res *= a;
}
a *= a;
b /= 2;
}
return res;
}
// factorial
// align with fft, if code fails to compile make this smaller (if using array)
static constexpr int MXINV = 1 << 22;
static inline bool init = false;
static inline std::vector<Mod> ff, iff;
static void reset_fac() { init = false; }
static void init_fac() {
if (init) {
return;
}
ff.resize(MXINV + 1);
ff[0] = Mod(1);
for (int i = 1; i <= MXINV; ++i) {
ff[i] = ff[i - 1] * Mod(i);
}
iff.resize(MXINV + 1);
iff[MXINV] = ff[MXINV].large_inv();
for (int i = MXINV - 1; i >= 0; --i) {
iff[i] = iff[i + 1] * Mod(i + 1);
}
init = true;
}
static Mod fac(int v) {
if (!init) {
init_fac();
}
return ff[v];
}
static Mod ifac(int v) {
if (!init) {
init_fac();
}
return iff[v];
}
static Mod comb(int n, int k) {
if (n < 0 || k < 0 || n < k) {
return Mod(0);
}
return fac(n) * ifac(n - k) * ifac(k);
}
static Mod perm(int n, int k) {
if (n < 0 || k < 0 || n < k) {
return Mod(0);
}
return fac(n) * ifac(n - k);
}
// inverse
Mod small_inv() const {
return ifac(static_cast<int>(val)) * fac(static_cast<int>(val) - 1);
}
constexpr Mod large_inv() const {
return Mod(ex_eucl(static_cast<V>(val), static_cast<V>(Md::value)).first);
// return binpow(Md::value - 2);
}
Mod inv() const {
if (val <= MXINV) {
return small_inv();
}
return large_inv();
}
// sqrt
std::optional<Mod> sqrt() {
static std::mt19937 rng(
std::chrono::steady_clock::now().time_since_epoch().count()
);
Mod c = Mod::ZERO;
while ((c * c - *this).binpow((Md::value - 1) / 2) == Mod::ONE) {
c = Mod(rng());
}
if (c == Mod::ZERO) {
return std::nullopt;
}
std::pair<Mod, Mod> res(Mod::ONE, Mod::ZERO), a(c, Mod::ONE);
T b = (Md::value + 1) / 2;
auto mul = [&c, this](
const std::pair<Mod, Mod> &u,
const std::pair<Mod, Mod> &v
) -> std::pair<Mod, Mod> {
return {
u.first * v.first + u.second * v.second * (c * c - *this),
u.second * v.first + u.first * v.second
};
};
while (b > 0) {
if (b % 2 == 1) {
res = mul(res, a);
}
a = mul(a, a);
b /= 2;
}
return res.first;
// return std::min(res.first, -res.first);
}
// comparison
constexpr bool operator==(const Mod &b) const = default;
constexpr std::strong_ordering operator<=>(const Mod &b) const = default;
// io
friend std::istream &operator>>(std::istream &in, Mod &a) {
int64_t v;
in >> v;
a = Mod(v);
return in;
}
friend std::ostream &operator<<(std::ostream &out, const Mod &a) {
out << a.val;
return out;
}
// conversion
constexpr T value() const { return val; }
};
#if defined(LOCAL) && __cplusplus >= 202302L
template <class Md, class V>
requires std::formattable<typename Mod<Md, V>::T, char>
struct std::formatter<Mod<Md, V>, char> {
using T = typename Mod<Md, V>::T;
std::formatter<T, char> underlying;
constexpr formatter() {
if constexpr (requires { underlying.set_debug_format(); }) {
underlying.set_debug_format();
}
}
template <class ParseContext> constexpr auto parse(ParseContext &ctx) {
return underlying.parse(ctx);
}
template <class FormatContext>
auto format(const Mod<Md, V> &val, FormatContext &ctx) const {
return underlying.format(val.value(), ctx);
}
};
#endif
constexpr int MOD = 998'244'353;
using Mint = Mod<std::integral_constant<std::decay_t<decltype(MOD)>, MOD>>;
struct Node {
int64_t dist;
int node, level;
auto operator<=>(const Node &b) const = default;
};
template <class T> struct Line {
T a, b;
auto operator<=>(const Line &b) const = default;
T operator()(T x) const { return a * x + b; }
};
template <class T, class Comp = std::less<>> struct LiChao {
static constexpr Comp comp{};
struct Node {
Line<T> line{0, INF<T>};
std::array<int, 2> ch{-1, -1};
bool is_leaf() const { return ch[0] == -1 && ch[1] == -1; }
};
T lb{}, ub{};
std::vector<Node> data{Node()};
LiChao() = default;
explicit LiChao(T r) : ub{r} {}
LiChao(T l, T r) : lb{l}, ub{r} {}
void alloc(int &ch, Line<T> line) {
ch = static_cast<int>(data.size());
data.push_back(Node{line});
}
void upd(Line<T> line, int ind, T l, T r) {
if (l == r) {
if (comp(line(l), data[ind].line(l))) {
data[ind].line = line;
}
return;
}
T mid = std::midpoint(l, r);
bool llt = comp(line(l), data[ind].line(l));
bool mlt = comp(line(mid), data[ind].line(mid));
if (mlt) {
std::swap(line, data[ind].line);
}
if (llt != mlt) {
if (data[ind].ch[0] != -1) {
upd(line, data[ind].ch[0], l, mid);
} else {
alloc(data[ind].ch[0], line);
}
} else if (data[ind].ch[1] != -1) {
upd(line, data[ind].ch[1], mid + 1, r);
} else {
alloc(data[ind].ch[1], line);
}
}
void upd(Line<T> line) { upd(line, 0, lb, ub); }
void upd(T a, T b) { upd(Line{a, b}); }
Mint sum(T x, int node, T l, T r, std::vector<Line<T>> &lines) {
if (l > x) {
return Mint::ZERO;
}
if (node != -1) {
lines.push_back(data[node].line);
}
if (node == -1 || data[node].is_leaf()) {
Line<T> mi{0, INF<T>};
for (Line<T> &line : lines) {
if (comp(line(l), mi(l))) {
mi = line;
}
}
if (node != -1) {
lines.pop_back();
}
return Mint{mi(l) + mi(std::min(r, x))} * Mint{std::min(r, x) - l + 1}
* Mint::TWO.inv();
}
int64_t mid = (l + r) / 2;
Mint ans = sum(x, data[node].ch[0], l, mid, lines)
+ sum(x, data[node].ch[1], mid + 1, r, lines);
lines.pop_back();
return ans;
}
Mint sum(T x) {
std::vector<Line<T>> lines;
Mint ans = sum(x, 0, lb, ub, lines);
assert(lines.empty());
return ans;
}
};
void solve() {
int n, m;
int64_t x;
std::cin >> n >> m >> x;
std::vector<std::vector<std::pair<int64_t, int>>> adj(n);
for (int i = 0; i < m; ++i) {
int a, b;
int64_t w;
std::cin >> a >> b >> w;
--a;
--b;
adj[a].emplace_back(w, b);
adj[b].emplace_back(w, a);
}
const int mx = 20000;
std::vector d0(mx + 2, std::vector(n, INF<int64_t>));
std::vector dn = d0;
auto sp = [&](int rt, std::vector<std::vector<int64_t>> &dist) {
dist[0][rt] = 0;
for (int i = 1; i <= mx + 1; ++i) {
for (int j = 0; j < n; ++j) {
for (auto [w, k] : adj[j]) {
dist[i][j] = std::min(dist[i][j], dist[i - 1][k] + w);
}
}
}
};
sp(0, d0);
Mint ans{0};
for (int i = 1; i <= std::min<int64_t>(x, mx - 1); ++i) {
ans += d0[i][n - 1] == INF<int64_t> ? Mint::ZERO : Mint{d0[i][n - 1]};
}
if (x <= mx - 1) {
std::cout << ans << '\n';
return;
}
sp(n - 1, dn);
std::vector dv(n, std::array<int64_t, 2>{INF<int64_t>, INF<int64_t>});
std::vector mi(n, INF<int64_t>);
for (int j = 0; j <= mx; ++j) {
for (int i = 0; i < n; ++i) {
dv[i][0] = std::min(dv[i][0], d0[j][i] + dn[mx - j][i]);
}
}
for (int j = 0; j <= mx + 1; ++j) {
for (int i = 0; i < n; ++i) {
dv[i][1] = std::min(dv[i][1], d0[j][i] + dn[(mx + 1) - j][i]);
}
}
for (int i = 0; i < n; ++i) {
for (auto [w, j] : adj[i]) {
mi[i] = std::min(mi[i], w);
}
}
std::array<LiChao<int64_t>, 2> dq;
dq.fill(LiChao<int64_t>(0, x));
for (int i = 0; i < n; ++i) {
if (mi[i] == INF<int64_t>) {
continue;
}
for (int t : {0, 1}) {
if (dv[i][t] == INF<int64_t>) {
continue;
}
dq[t].upd(2 * mi[i], dv[i][t]);
}
}
for (int t : {0, 1}) {
if (dq[t].data.size() == 1) {
continue;
}
int64_t lst = (x - (mx + t)) / 2;
ans += dq[t].sum(lst);
}
std::cout << ans << '\n';
}
int main() {
#ifndef LOCAL
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
#endif
int t;
std::cin >> t;
for (int i = 0; i < t; ++i) {
dbg(i + 1);
solve();
bar();
}
}
詳細信息
Test #1:
score: 100
Accepted
time: 45ms
memory: 38700kb
input:
4 3 2 10 1 2 5 2 3 4 3 0 1000000000 3 3 100 1 2 3 1 3 4 2 3 5 4 6 1000000000 1 2 244 1 2 325 1 4 927 3 3 248 2 4 834 3 4 285
output:
125 0 15300 840659991
result:
ok 4 number(s): "125 0 15300 840659991"
Test #2:
score: 0
Accepted
time: 743ms
memory: 38824kb
input:
400 4 7 850187899 1 2 83 1 2 24 3 1 23 2 3 80 3 3 65 1 2 55 2 4 31 4 7 297586795 3 4 54 1 1 66 2 2 75 1 3 68 1 4 27 1 4 29 2 3 96 5 7 217277444 3 3 9 3 4 36 2 2 77 5 5 38 3 3 6 1 2 18 1 2 23 5 6 379032278 5 5 96 4 3 92 3 2 49 4 3 44 1 4 19 1 1 18 5 6 534284598 5 1 59 1 2 2 3 3 55 2 2 24 5 4 34 2 4 7...
output:
191476186 406722183 0 0 58483482 115858544 177378789 656019644 858116309 0 38761681 633010531 0 696693112 919354187 122684249 865793975 91541737 248634956 0 374201737 455984810 284991806 322357914 0 514668426 407812429 555256220 0 419773408 989291360 743372489 0 716008724 0 189418326 244106015 41273...
result:
ok 400 numbers
Test #3:
score: 0
Accepted
time: 755ms
memory: 38892kb
input:
400 4 6 415388949 4 2 6853 4 3 5541 1 2 6273 4 4 8561 4 1 9638 4 2 8341 4 6 195566032 2 3 6344 1 1 7616 3 1 4823 4 1 647 4 4 7091 4 2 6307 4 6 720662513 3 3 4435 2 1 4448 4 3 3142 4 1 6670 2 4 5545 2 3 2990 5 7 806244066 3 2 3989 4 3 8157 5 2 612 3 5 8294 1 1 2114 3 4 2311 5 2 8825 5 6 894954332 4 1...
output:
392283147 970308579 491899881 0 495762954 10156057 664457753 0 575852185 134843393 933754264 590740253 0 490859785 724017823 957609109 0 622353894 279038091 426991125 0 637389724 0 75171267 749597224 258493187 250907837 497917111 886569508 828505392 68793449 224109727 139499076 786372001 894480753 4...
result:
ok 400 numbers
Test #4:
score: 0
Accepted
time: 769ms
memory: 38920kb
input:
400 4 6 626798206 4 4 835705 3 2 236950 2 4 952235 1 2 581609 3 2 204788 2 1 947505 5 7 121450775 2 2 288007 3 2 130288 5 4 76431 4 5 23594 2 5 675316 4 1 192066 3 3 275296 5 7 867412084 1 4 473530 4 3 242225 2 3 459428 2 2 852747 4 1 242292 1 2 9788 3 2 175026 5 6 270426492 5 4 75346 4 2 880851 5 2...
output:
359593563 746525185 0 0 73714485 664197694 720306834 414192169 852090104 263236207 112963474 326265087 32838160 575302262 917139513 704934710 717038510 608349067 804139086 30761395 0 885174847 903442468 235788993 315187893 267383762 881704492 392427980 511540414 82510129 841018587 628947824 90374582...
result:
ok 400 numbers
Test #5:
score: 0
Accepted
time: 747ms
memory: 38900kb
input:
400 4 7 237940126 2 3 811465519 3 1 406242509 4 2 568535949 4 4 916500298 3 2 79853489 2 4 485382745 2 3 421622532 5 6 680552144 5 4 315694734 4 1 414031567 5 4 530765372 2 5 734798151 4 5 677388912 3 2 511925895 4 6 174169143 1 2 355579133 1 1 374390087 3 3 393590012 2 3 72192607 1 2 898660531 3 1 ...
output:
80828666 371586866 0 167800461 410107945 445437334 0 610069154 796266829 467729673 259462318 581867042 658714588 354982099 590749802 487914460 0 115063504 426498590 124790015 0 408391987 0 108209715 16338078 814297806 454529244 185281507 453042901 940987029 353015051 435087926 0 0 246967770 0 929531...
result:
ok 400 numbers
Test #6:
score: 0
Accepted
time: 402ms
memory: 53380kb
input:
40 46 100 796871833 14 45 5 34 15 75 18 35 36 18 24 62 7 36 17 17 9 45 31 33 11 33 15 34 23 5 72 23 27 44 16 15 3 10 28 18 1 36 89 4 40 32 46 43 55 14 22 61 30 15 36 8 2 82 21 12 15 42 45 78 26 40 11 46 32 42 26 46 10 39 40 83 37 39 95 45 27 45 32 37 91 2 19 34 9 7 74 28 5 99 3 44 34 33 38 6 18 13 7...
output:
486700134 857700687 608672173 864577567 889360467 813527860 503310571 949592684 427562681 54612131 295765111 981822742 297387832 510195726 183427910 339067217 163331381 781441071 387001805 800276039 215789954 315236685 325091800 561623521 0 564200504 58828620 705573545 860792488 149660643 968795549 ...
result:
ok 40 numbers
Test #7:
score: 0
Accepted
time: 407ms
memory: 53132kb
input:
40 49 98 637035062 28 11 4294 36 2 7586 44 33 6870 19 3 4054 38 5 2009 2 26 6184 5 45 2951 33 23 7022 18 38 3008 46 19 8137 49 18 6080 18 37 8209 18 8 9077 31 43 6509 42 22 5743 2 18 9127 16 2 8584 38 11 7504 15 12 2867 1 19 8063 11 26 9017 17 3 6127 23 19 5473 13 38 4521 25 37 7360 31 34 6656 47 22...
output:
821693058 71016907 857321273 783587298 982610065 980278015 275485521 971090373 233315886 399922806 0 278608644 378866648 599249221 340396754 540768603 530594607 776205772 730857174 933810552 227365258 382149558 937071245 521975672 690097593 73883754 33862436 462058733 443441774 438932117 64257634 58...
result:
ok 40 numbers
Test #8:
score: 0
Accepted
time: 407ms
memory: 53200kb
input:
40 46 95 723931456 35 20 947776 31 38 238603 37 17 836768 12 40 35931 25 6 38152 17 27 195009 37 26 230999 2 12 963773 22 18 283748 9 34 499029 30 9 601767 38 4 966623 21 3 740901 32 31 66189 9 46 751585 38 27 412857 40 28 136769 2 17 118003 21 18 102142 45 31 319817 33 13 496656 16 5 168278 37 15 9...
output:
862261239 934208524 676535904 425060961 680809878 921710894 166137599 490099382 786664556 667359023 117551032 65363912 805410419 453568705 636903494 876708711 0 874460066 688545496 770335168 196141613 286072255 826782785 385627101 487670842 692193056 921891801 493485960 746027697 94281264 761466453 ...
result:
ok 40 numbers
Test #9:
score: 0
Accepted
time: 415ms
memory: 53140kb
input:
40 50 90 857563025 2 11 393746492 45 46 345072720 13 18 637861512 47 3 571609922 50 35 402605542 23 36 161663167 27 20 267096312 50 47 967313350 6 23 797326121 12 47 19611590 32 22 693454539 6 40 749059549 14 47 655748726 9 32 774397775 49 22 471626653 18 23 775770441 8 47 263012466 17 27 714895319 ...
output:
823474705 897491227 830605997 310507990 396608942 755858403 192083730 558837131 397169944 133851804 124398473 334337729 676169091 498313169 10613351 887468199 938570424 730866390 93748497 991959257 969327421 950615046 29589899 290773789 436801411 468797561 311350228 807413343 196500651 737421403 330...
result:
ok 40 numbers
Test #10:
score: 0
Accepted
time: 514ms
memory: 189472kb
input:
4 452 997 787553451 224 333 31 99 434 28 63 105 64 15 304 41 43 356 18 359 280 70 446 415 69 256 296 47 276 108 23 138 249 8 152 281 31 284 122 45 1 10 39 348 216 4 260 386 51 442 340 3 305 316 81 103 267 18 444 14 16 418 221 20 366 343 72 448 265 44 419 417 60 433 251 19 138 373 42 221 251 52 219 2...
output:
920051934 337790394 379237832 857209587
result:
ok 4 number(s): "920051934 337790394 379237832 857209587"
Test #11:
score: 0
Accepted
time: 512ms
memory: 190344kb
input:
4 488 933 522189685 296 341 4432 469 325 7333 230 83 8870 61 45 9898 236 85 6295 90 304 7287 486 400 6268 115 485 7251 455 214 9376 74 402 2519 461 119 4761 379 238 966 235 139 5469 365 82 5901 143 101 4371 110 323 8173 126 186 9270 451 315 9574 340 282 2321 152 360 7030 112 317 3895 388 484 1202 21...
output:
603678306 943491463 173268290 201396620
result:
ok 4 number(s): "603678306 943491463 173268290 201396620"
Test #12:
score: 0
Accepted
time: 503ms
memory: 188920kb
input:
4 475 925 862065786 223 259 326692 311 176 146944 236 82 519523 454 402 81050 314 40 916288 147 431 876771 457 438 621257 400 157 931920 22 170 696985 236 219 335364 229 83 709348 238 112 98295 284 436 112450 38 119 757155 256 275 92474 194 116 661424 306 15 548944 308 426 87714 9 203 246801 288 448...
output:
0 700852946 806811784 955695134
result:
ok 4 number(s): "0 700852946 806811784 955695134"
Test #13:
score: -100
Wrong Answer
time: 495ms
memory: 192856kb
input:
4 468 943 401471037 16 76 84807660 391 15 339856779 217 269 160461855 105 400 445538323 90 401 136863755 23 152 971192392 51 339 208461283 467 55 188586800 61 65 493966321 140 229 716542747 182 270 337275222 154 76 601108616 377 254 684327428 103 375 734134843 327 225 26827769 26 248 368659099 457 5...
output:
158572391 663760343 713171553 558927337
result:
wrong answer 4th numbers differ - expected: '450639895', found: '558927337'