結果
問題 | No.1 道のショートカット |
ユーザー |
|
提出日時 | 2024-02-20 17:21:11 |
言語 | Rust (1.83.0 + proconio) |
結果 |
AC
|
実行時間 | 3 ms / 5,000 ms |
コード長 | 10,606 bytes |
コンパイル時間 | 11,791 ms |
コンパイル使用メモリ | 399,520 KB |
実行使用メモリ | 6,820 KB |
最終ジャッジ日時 | 2024-09-29 03:46:39 |
合計ジャッジ時間 | 13,224 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 40 |
ソースコード
pub struct Writer<W: Write> {writer: BufWriter<W>,}impl<W: Write> Writer<W> {pub fn new(write: W) -> Self {Self {writer: BufWriter::new(write),}}pub fn ln<S: Display>(&mut self, s: S) {writeln!(self.writer, "{}", s).expect("Failed to write.")}pub fn out<S: Display>(&mut self, s: S) {write!(self.writer, "{}", s).expect("Failed to write.")}pub fn join<S: Display>(&mut self, v: &[S], separator: &str) {v.iter().fold("", |sep, arg| {write!(self.writer, "{}{}", sep, arg).expect("Failed to write.");separator});writeln!(self.writer).expect("Failed to write.");}pub fn bits(&mut self, i: i64, len: usize) {(0..len).for_each(|b| write!(self.writer, "{}", i >> b & 1).expect("Failed to write."));writeln!(self.writer).expect("Failed to write.")}pub fn flush(&mut self) {let _ = self.writer.flush();}}pub struct Reader<F> {init: F,buf: VecDeque<String>,}impl<R: BufRead, F: FnMut() -> R> Iterator for Reader<F> {type Item = String;fn next(&mut self) -> Option<String> {if self.buf.is_empty() {let mut reader = (self.init)();let mut l = String::new();reader.read_line(&mut l).unwrap();self.buf.append(&mut l.split_whitespace().map(ToString::to_string).collect());}self.buf.pop_front()}}impl<R: BufRead, F: FnMut() -> R> Reader<F> {pub fn new(init: F) -> Self {let buf = VecDeque::new();Reader { init, buf }}pub fn v<T: FS>(&mut self) -> T {let s = self.next().expect("Insufficient input.");s.parse().ok().expect("Failed to parse.")}pub fn v2<T1: FS, T2: FS>(&mut self) -> (T1, T2) {(self.v(), self.v())}pub fn v3<T1: FS, T2: FS, T3: FS>(&mut self) -> (T1, T2, T3) {(self.v(), self.v(), self.v())}pub fn v4<T1: FS, T2: FS, T3: FS, T4: FS>(&mut self) -> (T1, T2, T3, T4) {(self.v(), self.v(), self.v(), self.v())}pub fn v5<T1: FS, T2: FS, T3: FS, T4: FS, T5: FS>(&mut self) -> (T1, T2, T3, T4, T5) {(self.v(), self.v(), self.v(), self.v(), self.v())}pub fn vec<T: FS>(&mut self, length: usize) -> Vec<T> {(0..length).map(|_| self.v()).collect()}pub fn vec2<T1: FS, T2: FS>(&mut self, length: usize) -> Vec<(T1, T2)> {(0..length).map(|_| self.v2()).collect()}pub fn vec3<T1: FS, T2: FS, T3: FS>(&mut self, length: usize) -> Vec<(T1, T2, T3)> {(0..length).map(|_| self.v3()).collect()}pub fn vec4<T1: FS, T2: FS, T3: FS, T4: FS>(&mut self, length: usize) -> Vec<(T1, T2, T3, T4)> {(0..length).map(|_| self.v4()).collect()}pub fn chars(&mut self) -> Vec<char> {self.v::<String>().chars().collect()}fn split(&mut self, zero: u8) -> Vec<usize> {self.v::<String>().chars().map(|c| (c as u8 - zero) as usize).collect()}pub fn digits(&mut self) -> Vec<usize> {self.split(b'0')}pub fn lowercase(&mut self) -> Vec<usize> {self.split(b'a')}pub fn uppercase(&mut self) -> Vec<usize> {self.split(b'A')}pub fn char_map(&mut self, h: usize) -> Vec<Vec<char>> {(0..h).map(|_| self.chars()).collect()}pub fn bool_map(&mut self, h: usize, ng: char) -> Vec<Vec<bool>> {self.char_map(h).iter().map(|v| v.iter().map(|&c| c != ng).collect()).collect()}pub fn matrix<T: FS>(&mut self, h: usize, w: usize) -> Vec<Vec<T>> {(0..h).map(|_| self.vec(w)).collect()}}pub fn to_lr<T, R: RangeBounds<T>>(range: &R, length: T) -> (T, T)whereT: Copy + One + Zero + Add<Output = T> + PartialOrd,{use Bound::{Excluded, Included, Unbounded};let l = match range.start_bound() {Unbounded => T::zero(),Included(&s) => s,Excluded(&s) => s + T::one(),};let r = match range.end_bound() {Unbounded => length,Included(&e) => e + T::one(),Excluded(&e) => e,};assert!(l <= r && r <= length);(l, r)}pub use std::{cmp::{max, min, Ordering, Reverse},collections::{BTreeMap, BTreeSet, BinaryHeap, HashMap, HashSet, VecDeque},convert::Infallible,convert::{TryFrom, TryInto},fmt::{Debug, Display, Formatter},io::{stdin, stdout, BufRead, BufWriter, Read, Write},iter::{repeat, Product, Sum},marker::PhantomData,mem::swap,ops::{Add, AddAssign, BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign, Bound,Deref, DerefMut, Div, DivAssign, Index, IndexMut, Mul, MulAssign, Neg, Not, Range,RangeBounds, Rem, RemAssign, Shl, ShlAssign, Shr, ShrAssign, Sub, SubAssign,},str::{from_utf8, FromStr as FS},};#[allow(unused_macros)]macro_rules ! chmin {($ base : expr , $ ($ cmps : expr ) ,+ $ (, ) * ) => {{let cmp_min = min ! ($ ($ cmps ) ,+ ) ; if $ base > cmp_min {$ base =cmp_min ; true } else {false } } } ; }#[allow(unused_macros)]macro_rules ! min {($ a : expr $ (, ) * ) => {{$ a } } ; ($ a : expr , $ b : expr $ (, ) * ) => {{if $ a > $ b {$ b } else {$ a } } } ; ($ a : expr ,$ ($ rest : expr ) ,+ $ (, ) * ) => {{let b = min ! ($ ($ rest ) ,+ ) ; if $ a > b {b } else {$ a } } } ; }#[allow(unused_macros)]macro_rules ! chmax {($ base : expr , $ ($ cmps : expr ) ,+ $ (, ) * ) => {{let cmp_max = max ! ($ ($ cmps ) ,+ ) ; if $ base < cmp_max {$ base =cmp_max ; true } else {false } } } ; }#[allow(unused_macros)]macro_rules ! max {($ a : expr $ (, ) * ) => {{$ a } } ; ($ a : expr , $ b : expr $ (, ) * ) => {{if $ a > $ b {$ a } else {$ b } } } ; ($ a : expr ,$ ($ rest : expr ) ,+ $ (, ) * ) => {{let b = max ! ($ ($ rest ) ,+ ) ; if $ a > b {$ a } else {b } } } ; }pub trait Magma {type M: Clone + PartialEq + Debug;fn op(x: &Self::M, y: &Self::M) -> Self::M;}pub trait Associative {}pub trait Unital: Magma {fn unit() -> Self::M;}pub trait Commutative: Magma {}pub trait Invertible: Magma {fn inv(x: &Self::M) -> Self::M;}pub trait Idempotent: Magma {}pub trait SemiGroup: Magma + Associative {}pub trait Monoid: Magma + Associative + Unital {fn pow(&self, x: Self::M, mut n: usize) -> Self::M {let mut res = Self::unit();let mut base = x;while n > 0 {if n & 1 == 1 {res = Self::op(&res, &base);}base = Self::op(&base, &base);n >>= 1;}res}}impl<M: Magma + Associative + Unital> Monoid for M {}pub trait CommutativeMonoid: Magma + Associative + Unital + Commutative {}impl<M: Magma + Associative + Unital + Commutative> CommutativeMonoid for M {}pub trait Group: Magma + Associative + Unital + Invertible {}impl<M: Magma + Associative + Unital + Invertible> Group for M {}pub trait AbelianGroup: Magma + Associative + Unital + Commutative + Invertible {}impl<M: Magma + Associative + Unital + Commutative + Invertible> AbelianGroup for M {}pub trait Band: Magma + Associative + Idempotent {}impl<M: Magma + Associative + Idempotent> Band for M {}pub trait MapMonoid {type Mono: Monoid;type Func: Monoid;fn op(&self,x: &<Self::Mono as Magma>::M,y: &<Self::Mono as Magma>::M,) -> <Self::Mono as Magma>::M {Self::Mono::op(x, y)}fn unit() -> <Self::Mono as Magma>::M {Self::Mono::unit()}fn apply(&self,f: &<Self::Func as Magma>::M,value: &<Self::Mono as Magma>::M,) -> <Self::Mono as Magma>::M;fn identity_map() -> <Self::Func as Magma>::M {Self::Func::unit()}fn compose(&self,f: &<Self::Func as Magma>::M,g: &<Self::Func as Magma>::M,) -> <Self::Func as Magma>::M {Self::Func::op(f, g)}}pub trait Zero {fn zero() -> Self;}pub trait One {fn one() -> Self;}pub trait BoundedBelow {fn min_value() -> Self;}pub trait BoundedAbove {fn max_value() -> Self;}# [rustfmt :: skip ] pub trait Integral : 'static + Send + Sync + Copy + Ord + Display + Debug + Add < Output = Self > + Sub < Output = Self > + Mul< Output = Self > + Div < Output = Self > + Rem < Output = Self > + AddAssign + SubAssign + MulAssign + DivAssign + RemAssign + Sum + Product +BitOr < Output = Self > + BitAnd < Output = Self > + BitXor < Output = Self > + Not < Output = Self > + Shl < Output = Self > + Shr < Output =Self > + BitOrAssign + BitAndAssign + BitXorAssign + ShlAssign + ShrAssign + Zero + One + BoundedBelow + BoundedAbove {}macro_rules ! impl_integral {($ ($ ty : ty ) ,* ) => {$ (impl Zero for $ ty {fn zero () -> Self {0 } } impl One for $ ty {fn one () -> Self {1 } }impl BoundedBelow for $ ty {fn min_value () -> Self {Self :: min_value () } } impl BoundedAbove for $ ty {fn max_value () -> Self {Self ::max_value () } } impl Integral for $ ty {} ) * } ; }impl_integral!(i8, i16, i32, i64, i128, isize, u8, u16, u32, u64, u128, usize);pub fn main() {let stdin = stdin();let stdout = stdout();solve(Reader::new(|| stdin.lock()), Writer::new(stdout.lock()));}pub fn solve<R: BufRead, W: Write, F: FnMut() -> R>(mut reader: Reader<F>, mut writer: Writer<W>) {let n: usize = reader.v();let c: usize = reader.v();let v: usize = reader.v();let ss: Vec<usize> = reader.vec::<usize>(v);let tt: Vec<usize> = reader.vec::<usize>(v);let ys: Vec<usize> = reader.vec::<usize>(v);let ms: Vec<u32> = reader.vec::<u32>(v);let g: Vec<Vec<(usize, usize, u32)>> = {let mut graph: Vec<Vec<(usize, usize, u32)>> = vec![vec![]; n];for (((s, t), y), m) in ss.into_iter().zip(tt).zip(ys).zip(ms) {graph[s - 1].push((t - 1, y, m));}graph};let mut cost: Vec<Vec<u32>> = vec![vec![u32::max_value(); n]; c + 1];cost[c][0] = 0;let mut que: VecDeque<(usize, usize)> = VecDeque::from(vec![(c, 0)]);while let Some((c, s)) = que.pop_front() {for &(t, y, m) in &g[s]{if y <= c && cost[c][s] + m < cost[c - y][t]{cost[c - y][t] = cost[c][s] + m;que.push_back((c - y, t));}}}let ans: u32 = (0..=c).map(|c| cost[c][n - 1]).min().unwrap();if ans == u32::max_value() {writer.ln("-1")} else{writer.ln(ans)}}