結果
問題 | No.1 道のショートカット |
ユーザー | xpic |
提出日時 | 2024-11-22 04:38:05 |
言語 | C++23(gcc13) (gcc 13.2.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 3 ms / 5,000 ms |
コード長 | 9,154 bytes |
コンパイル時間 | 2,908 ms |
コンパイル使用メモリ | 214,120 KB |
実行使用メモリ | 5,248 KB |
最終ジャッジ日時 | 2024-11-22 04:38:10 |
合計ジャッジ時間 | 4,422 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 2 ms
5,248 KB |
testcase_02 | AC | 3 ms
5,248 KB |
testcase_03 | AC | 2 ms
5,248 KB |
testcase_04 | AC | 2 ms
5,248 KB |
testcase_05 | AC | 2 ms
5,248 KB |
testcase_06 | AC | 2 ms
5,248 KB |
testcase_07 | AC | 2 ms
5,248 KB |
testcase_08 | AC | 2 ms
5,248 KB |
testcase_09 | AC | 3 ms
5,248 KB |
testcase_10 | AC | 2 ms
5,248 KB |
testcase_11 | AC | 3 ms
5,248 KB |
testcase_12 | AC | 3 ms
5,248 KB |
testcase_13 | AC | 3 ms
5,248 KB |
testcase_14 | AC | 3 ms
5,248 KB |
testcase_15 | AC | 3 ms
5,248 KB |
testcase_16 | AC | 3 ms
5,248 KB |
testcase_17 | AC | 2 ms
5,248 KB |
testcase_18 | AC | 2 ms
5,248 KB |
testcase_19 | AC | 2 ms
5,248 KB |
testcase_20 | AC | 2 ms
5,248 KB |
testcase_21 | AC | 2 ms
5,248 KB |
testcase_22 | AC | 2 ms
5,248 KB |
testcase_23 | AC | 3 ms
5,248 KB |
testcase_24 | AC | 2 ms
5,248 KB |
testcase_25 | AC | 2 ms
5,248 KB |
testcase_26 | AC | 2 ms
5,248 KB |
testcase_27 | AC | 3 ms
5,248 KB |
testcase_28 | AC | 2 ms
5,248 KB |
testcase_29 | AC | 2 ms
5,248 KB |
testcase_30 | AC | 3 ms
5,248 KB |
testcase_31 | AC | 2 ms
5,248 KB |
testcase_32 | AC | 2 ms
5,248 KB |
testcase_33 | AC | 3 ms
5,248 KB |
testcase_34 | AC | 2 ms
5,248 KB |
testcase_35 | AC | 3 ms
5,248 KB |
testcase_36 | AC | 2 ms
5,248 KB |
testcase_37 | AC | 3 ms
5,248 KB |
testcase_38 | AC | 2 ms
5,248 KB |
testcase_39 | AC | 3 ms
5,248 KB |
testcase_40 | AC | 2 ms
5,248 KB |
testcase_41 | AC | 2 ms
5,248 KB |
testcase_42 | AC | 2 ms
5,248 KB |
testcase_43 | AC | 3 ms
5,248 KB |
ソースコード
#pragma GCC optimize("Ofast") #pragma GCC optimize("unroll-loops") #define __GLIBCXX_BITSIZE_INT_N_0 128 #define __GLIBCXX_TYPE_INT_N_0 __int128 #include <algorithm> #include <array> #include <concepts> #include <cstdint> #include <cstdio> #include <cstring> #include <filesystem> #include <iterator> #include <limits> #include <string_view> #include <tuple> #include <type_traits> #include <utility> #include <vector> namespace fastio { static constexpr int BUF_SIZE = 1 << 17; class QI { private: FILE *stream_; std::array<char, BUF_SIZE> buf_ = {}; char *begin_; char *end_; char *ptr_; void skip_space() { while (*ptr_ <= ' ') ++ptr_; } template<int N = 0> void read() { if (const auto n = end_ - ptr_; n <= N) { std::ignore = fread(std::copy_n(ptr_, n, begin_), 1, BUF_SIZE - n, stream_); ptr_ = begin_; } } template<std::unsigned_integral T> void parse(T &x) { std::common_type_t<T, std::uint64_t> x2 = 0; while (true) { std::uint64_t v; std::memcpy(&v, ptr_, 8); if ((v -= 0x3030303030303030) & 0x8080808080808080) break; v = (v * 10 + (v >> 8)) & 0xff00ff00ff00ff; v = (v * 100 + (v >> 16)) & 0xffff0000ffff; v = (v * 10000 + (v >> 32)) & 0xffffffff; x2 = 100000000 * x2 + v; ptr_ += 8; } while (true) { std::uint32_t v; std::memcpy(&v, ptr_, 4); if ((v -= 0x30303030) & 0x80808080) break; v = (v * 10 + (v >> 8)) & 0xff00ff; v = (v * 100 + (v >> 16)) & 0xffff; x2 = 10000 * x2 + v; ptr_ += 4; break; } while (true) { std::uint16_t v; std::memcpy(&v, ptr_, 2); if ((v -= 0x3030) & 0x8080) break; v = (v * 10 + (v >> 8)) & 0xff; x2 = 100 * x2 + v; ptr_ += 2; break; } if (' ' < *ptr_) { x2 *= 10; x2 += *ptr_++ - '0'; } ++ptr_; x = static_cast<T>(x2); } public: QI() : QI(stdin) {} explicit QI(const std::filesystem::path& p) : QI(fopen(p.c_str(), "r")) {} explicit QI(FILE *stream) : stream_(stream), begin_(buf_.data()), end_(begin_ + BUF_SIZE), ptr_(end_) { read(); } ~QI() { if (stream_ != stdin) fclose(stream_); } QI(const QI&) = delete; QI &operator=(const QI&) = delete; template<std::unsigned_integral T> void operator()(T &x) { skip_space(); read<64>(); parse(x); } template<std::signed_integral T> void operator()(T &x) { skip_space(); read<64>(); std::make_unsigned_t<T> u; if (*ptr_ == '-') { ++ptr_; parse(u); u = -u; } else { parse(u); } x = u; } void operator()(char &x) { skip_space(); read<64>(); x = *ptr_; ++ptr_; } void operator()(std::string &x) { x = ""; skip_space(); read<64>(); while (*ptr_ > ' ' && *ptr_ != '\0') { x.push_back(*ptr_); ++ptr_; } ++ptr_; } template<class... Ts> requires(sizeof...(Ts) != 1) void operator () (Ts&... xs) { ((*this)(xs), ...); } template<class T> QI &operator>>(T &x) { (*this)(x); return *this; } }; // class QI class QO { private: FILE *stream_; std::array<char, BUF_SIZE> buf_ = {}; char *begin_; char *end_; char *ptr_; template<class T> static constexpr int DIGITS = std::numeric_limits<T>::digits10 + 1; template<class T> static constexpr auto POW10 = [] { std::array<T, DIGITS<T>> ret; ret[0] = 1; for (int i = 1; i < DIGITS<T>; ++i) { ret[i] = 10 * ret[i - 1]; } return ret; } (); static constexpr auto LUT = [] { std::array<char, 40000> res; char* p = res.data(); char a = '0', b = '0', c = '0', d = '0'; do { *p++ = a, *p++ = b, *p++ = c, *p++ = d; } while (d++ < '9' || (d = '0', c++ < '9' || (c = '0', b++ < '9' || (b = '0', a++ < '9')))); return res; } (); template<int N = BUF_SIZE> void flush() { if (end_ - ptr_ <= N) { fwrite(begin_, 1, ptr_ - begin_, stream_); ptr_ = begin_; } } template<int N = 4> void le4(std::uint64_t x) { if constexpr (1 < N) { if (x < POW10<std::uint64_t>[N - 1]) { le4<N - 1>(x); return; } } ptr_ = std::copy_n(&LUT[x * 4 + (4 - N)], N, ptr_); } template<int N> void w4(std::uint64_t x) { if constexpr (0 < N) { ptr_ = std::copy_n(&LUT[x / POW10<std::uint64_t>[N - 4] * 4], 4, ptr_); w4<N - 4>(x % POW10<std::uint64_t>[N - 4]); } } template<int N> void write(std::uint64_t x) { if constexpr (N < DIGITS<std::uint64_t>) { if (POW10<std::uint64_t>[N] <= x) { write<N + 4>(x); return; } } le4(x / POW10<std::uint64_t>[N - 4]); w4<N - 4>(x % POW10<std::uint64_t>[N - 4]); } void write(std::unsigned_integral auto x) { write<4>(x); } void write(__uint128_t x) { if (x < POW10<__uint128_t>[16]) { write(static_cast<std::uint64_t>(x)); } else if (x < POW10<__uint128_t>[32]) { write(static_cast<std::uint64_t>(x / POW10<__uint128_t>[16])); w4<16>(static_cast<std::uint64_t>(x % POW10<__uint128_t>[16])); } else { write(static_cast<std::uint64_t>(x / POW10<__uint128_t>[32])); x %= POW10<__uint128_t>[32]; w4<16>(static_cast<std::uint64_t>(x / POW10<__uint128_t>[16])); w4<16>(static_cast<std::uint64_t>(x % POW10<__uint128_t>[16])); } } public: QO() : QO(stdout) {} explicit QO(const std::filesystem::path& p) : QO(fopen(p.c_str(), "w")) {} explicit QO(FILE* stream) : stream_(stream), begin_(buf_.data()), end_(begin_ + BUF_SIZE), ptr_(begin_) {} ~QO() { flush(); if (stream_ != stdout) { fclose(stream_); } } QO(const QO&) = delete; QO& operator = (const QO&) = delete; template<std::unsigned_integral T> void operator()(T x) { flush<DIGITS<T>>(); write(x); } template<std::signed_integral T> void operator()(T x) { flush<1 + DIGITS<T>>(); using U = std::make_unsigned_t<T>; const U u = x; if (x < 0) { *ptr_++ = '-'; write(static_cast<U>(-u)); } else { write(u); } } void operator()(char c) { flush<1>(); *ptr_++ = c; } void operator()(std::string_view s) { while (!s.empty()) { flush<0>(); const auto n = std::min(std::ssize(s), end_ - ptr_); if (n == BUF_SIZE) { fwrite(s.data(), 1, BUF_SIZE, stream_); } else { ptr_ = std::copy_n(s.data(), n, ptr_); } s.remove_prefix(n); } flush<0>(); } template <char End = '\n', char Sep = ' ', class T, class... Ts> void ln(T&& x, Ts&&... xs) { (*this)(forward<T>(x)); if constexpr (sizeof...(Ts) == 0) { *ptr_++ = End; } else { *ptr_++ = Sep; ln<End, Sep>(forward<Ts>(xs)...); } } template<class T> QO& operator<<(T x) { (*this)(x); return *this; } }; // class QO fastio::QI cin; fastio::QO cout; } // namespace fastio void yuki1() { using fastio::cin, fastio::cout; using i32 = std::int32_t; using u32 = std::uint32_t; using i64 = std::int64_t; using u64 = std::uint64_t; using i128 = __int128_t; using u128 = __uint128_t; const i32 inf = 1e9+7; i32 n, c, v; cin >> n >> c >> v; std::vector<i32> S(v), T(v), Y(v), M(v); for (auto &a : S) cin >> a, a--; for (auto &a : T) cin >> a, a--; for (auto &a : Y) cin >> a; for (auto &a : M) cin >> a; std::vector<std::vector<std::tuple<i32,i32,i32>>> g(n); for (int i = 0; i < v; i++) g.at(S.at(i)).push_back({T.at(i), Y.at(i), M.at(i)}); std::vector<std::vector<i32>> dp(n, std::vector<i32>(c + 1, inf)); dp.at(0).at(c) = 0; for (int i = 0; i < n; i++) { for (int j = 1; j <= c; j++) { if (dp.at(i).at(j) == inf) continue; for (auto [to, cost, time] : g.at(i)) { if (j < cost) continue; dp.at(to).at(j - cost) = std::min(dp.at(to).at(j - cost), dp.at(i).at(j) + time); } } } i32 res = *min_element(dp.at(n - 1).begin(), dp.at(n - 1).end()); if (res == inf) res = -1; cout << res << '\n'; } int main() { yuki1(); }