結果
問題 | No.2387 Yokan Factory |
ユーザー | Alex Wice |
提出日時 | 2023-07-21 21:36:53 |
言語 | C++23 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 211 ms / 5,000 ms |
コード長 | 6,580 bytes |
コンパイル時間 | 4,553 ms |
コンパイル使用メモリ | 279,652 KB |
実行使用メモリ | 9,984 KB |
最終ジャッジ日時 | 2024-09-21 22:57:33 |
合計ジャッジ時間 | 7,377 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 2 ms
5,248 KB |
testcase_02 | AC | 1 ms
5,376 KB |
testcase_03 | AC | 2 ms
5,376 KB |
testcase_04 | AC | 2 ms
5,376 KB |
testcase_05 | AC | 2 ms
5,376 KB |
testcase_06 | AC | 2 ms
5,376 KB |
testcase_07 | AC | 2 ms
5,376 KB |
testcase_08 | AC | 2 ms
5,376 KB |
testcase_09 | AC | 2 ms
5,376 KB |
testcase_10 | AC | 1 ms
5,376 KB |
testcase_11 | AC | 2 ms
5,376 KB |
testcase_12 | AC | 2 ms
5,376 KB |
testcase_13 | AC | 2 ms
5,376 KB |
testcase_14 | AC | 2 ms
5,376 KB |
testcase_15 | AC | 142 ms
9,984 KB |
testcase_16 | AC | 67 ms
9,140 KB |
testcase_17 | AC | 192 ms
9,396 KB |
testcase_18 | AC | 185 ms
8,720 KB |
testcase_19 | AC | 128 ms
7,056 KB |
testcase_20 | AC | 79 ms
6,708 KB |
testcase_21 | AC | 206 ms
8,356 KB |
testcase_22 | AC | 81 ms
6,440 KB |
testcase_23 | AC | 191 ms
6,988 KB |
testcase_24 | AC | 70 ms
6,556 KB |
testcase_25 | AC | 88 ms
5,640 KB |
testcase_26 | AC | 211 ms
7,656 KB |
testcase_27 | AC | 97 ms
8,092 KB |
testcase_28 | AC | 2 ms
5,376 KB |
testcase_29 | AC | 2 ms
5,376 KB |
testcase_30 | AC | 3 ms
5,376 KB |
testcase_31 | AC | 2 ms
5,376 KB |
testcase_32 | AC | 3 ms
5,376 KB |
testcase_33 | AC | 2 ms
5,376 KB |
testcase_34 | AC | 3 ms
5,376 KB |
testcase_35 | AC | 2 ms
5,376 KB |
testcase_36 | AC | 2 ms
5,376 KB |
testcase_37 | AC | 2 ms
5,376 KB |
ソースコード
#include "bits/stdc++.h" #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; using namespace std; // clang-format off #ifdef LOCAL #include "debug.h" #else #define debug(...) #endif using ll = long long; using str = string; using AR2 = array<int, 2>; template <class T> using oset = tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>; template <class T> using vec = vector<T>; template <class T> using vvec = vec<vec<T>>; template <class T> using vvvec = vec<vvec<T>>; template <class T, size_t SZ> using vac = vec<array<T, SZ>>; template <class T, size_t SZ> using vvac = vec<vac<T, SZ>>; template <class T> using pqueue = priority_queue<T, vec<T>>; template <class T> using pqueue_min = priority_queue<T, vec<T>, greater<T>>; #define sz(x) int((x).size()) #define all(x) begin(x), end(x) #define rall(x) x.rbegin(), x.rend() #define sor(x) sort(all(x)) #define pb push_back #define F_OR(i, a, b, s) for (int i=(a); (s)>0?i<(int)(b):i>(int)(b); i+=(s)) #define F_OR1(e) F_OR(i, 0, e, 1) #define F_OR2(i, e) F_OR(i, 0, e, 1) #define F_OR3(i, b, e) F_OR(i, b, e, 1) #define F_OR4(i, b, e, s) F_OR(i, b, e, s) #define GET5(a, b, c, d, e, ...) e #define F_ORC(...) GET5(__VA_ARGS__, F_OR4, F_OR3, F_OR2, F_OR1) #define FOR(...) F_ORC(__VA_ARGS__)(__VA_ARGS__) #define E_ACH2(x, a) for (auto& x: a) #define E_ACH3(x, y, a) for (auto& [x, y]: a) #define E_ACH4(x, y, z, a) for (auto& [x, y, z]: a) #define E_ACHC(...) GET5(__VA_ARGS__, E_ACH4, E_ACH3, E_ACH2) #define EACH(...) E_ACHC(__VA_ARGS__)(__VA_ARGS__) #define SUBMASKS(t, s) for (ll t = (s); t >= 0; t = (t == 0 ? -1 : (t - 1) & (s))) #define MIN(v) *min_element(all(v)) #define MAX(v) *max_element(all(v)) constexpr int popcount(int x) { return __builtin_popcount(x); } constexpr int bitlength(int x) { return x == 0 ? 0 : 31 - __builtin_clz(x); } ll cdiv(ll a, ll b) { return a/b + ((a^b) > 0 && a % b); }; ll fdiv(ll a, ll b) { return a/b - ((a^b) < 0 && a % b); }; template <class T> T pop(vec<T> &v) { T x = v.back(); v.pop_back(); return x; } template <class T> bool bounds(T a, T lo, T hi) { return lo <= a && a <= hi; } template <class T> T truemod(T x, T M) { return (x % M + M) % M; } template <class T> bool umin(T &a, const T &b) { return b < a ? a = b, 1 : 0; } template <class T> bool umax(T &a, const T &b) { return a < b ? a = b, 1 : 0; } template <class T> int lwb(vec<T> &a, T &b) { return int(lower_bound(all(a), b) - begin(a)); } template <class T> int upb(vec<T> &a, T &b) { return int(upper_bound(all(a), b) - begin(a)); } template <class T> void removeDupes(vec<T> &v) { sort(all(v)); v.erase(unique(all(v)), end(v)); } template <class T, class U> void eraseOne(T &t, U &u) { auto it = t.find(u); assert(it != end(t)); t.erase(it); } template <class T, class U> T firstTrue(T lo, T hi, U f) { ++hi; assert(lo <= hi); while (lo < hi) { T mi = lo + (hi-lo) / 2; f(mi) ? hi = mi : lo = mi + 1; } return lo; } template <class T, class U> T lastTrue(T lo, T hi, U f) { --lo; assert(lo <= hi); while (lo < hi) { T mi = lo + (hi-lo+1) / 2; f(mi) ? lo = mi : hi = mi - 1; } return lo; } template <class T, size_t SZ> istream &operator>>(istream &s, array<T, SZ>& v) { FOR(sz(v)) s >> v[i]; return s; } template <class T> istream &operator>>(istream &s, vec<T>& v) { FOR(sz(v)) s >> v[i]; return s; } template <class T> ostream &operator<<(ostream &s, vec<T>& v) { FOR(sz(v)) s << (i?" ":"") << v[i]; return s; } template <class T> ostream &operator<<(ostream &s, const vec<T>& v) { FOR(sz(v)) s << (i?" ":"") << v[i]; return s; } template<class A> void write(A x) { cout << x; } template<class H, class... T> void write(const H& h, const T&... t) { write(h); write(t...); } void print() { write("\n"); } template<class H, class... T> void print(const H& h, const T&... t) { write(h); if (sizeof...(t)) write(" "); print(t...); } void decrement() {} template <class T, size_t SZ> void decrement(vec<array<T, SZ>> &v) { EACH(row, v) EACH(x, row) --x; } template <class T> void decrement(vec<vec<T>> &v) { EACH(row, v) EACH(x, row) --x; } template <class T> void decrement(vec<T> &v) { EACH(x, v) --x; } template <class T, class... U> void decrement(T &t, U &...u) { --t; decrement(u...); } template <class T> void read(T& x) { cin >> x; } template<class T, class... U> void read(T &t, U &...u) { read(t); read(u...); } #define ints(...) int __VA_ARGS__; read(__VA_ARGS__); #define int1(...) ints(__VA_ARGS__); decrement(__VA_ARGS__); #define jnts(...) ll __VA_ARGS__; read(__VA_ARGS__); #define vint(n, a) int n; cin >> n; vec<int> a(n); cin >> a; #define vin(n, a) vec<int> a((n)); cin >> a; #define vjn(n, a) vec<ll> a((n)); cin >> a; #define vvin(n, m, a) vec<vec<int>> a((n), vec<int>((m))); cin >> a; #define vain(n, m, a) vec<array<int, (m)>> a((n)); cin >> a; #define graphin(n, m, adj) vvec<int> adj(n); FOR(m) {int1(u, v); adj[u].pb(v); adj[v].pb(u); } #define lgraphin(n, m, adj) vvac<int, 2> adj(n); FOR(i, m) {int1(u, v); adj[u].pb({v,i}); adj[v].pb({u,i}); } #define wgraphin(n, m, adj) vvac<int, 2> adj(n); FOR(m) {int1(u, v); ints(w); adj[u].pb({v,w}); adj[v].pb({u,w}); } #define dgraphin(n, m, adj) vvec<int> adj(n); FOR(m) {int1(u, v); adj[u].pb(v);} #define dwgraphin(n, m, adj) vvac<int, 2> adj(n); FOR(m) {int1(u, v, w); adj[u].pb({v, w+1});} /// void solve() { ints(N, M); ll X; cin >> X; vvac<int, 3> adj(N); FOR(mi, M) { int1(u,v); ints(a,b); adj[u].pb({v,a,b}); adj[v].pb({u,a,b}); } function<bool(int)> possible = [&] (int bound) { const ll INF = 2e18; vec<ll> dist(N, INF); pqueue_min<array<ll, 2>> pq; dist[0] = 0; pq.push({0, 0}); while (sz(pq)) { ll d = pq.top()[0], node = pq.top()[1]; pq.pop(); if (dist[node] < d) continue; if (node == N - 1) { return d <= X; } EACH(nei, w, b, adj[node]) { if (b < bound) continue; if (dist[nei] > d + w) { pq.push({dist[nei] = d + w, nei}); } } } return dist[N - 1] <= X; }; const int MX = 1e9 + 3; int ans = lastTrue(0, MX, possible); if (ans >= MX - 1) ans = -1; print(ans); } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); // ints(T); int T = 1; FOR(tc, T) { solve(); } return 0; }