結果
問題 |
No.3158 Collect Stamps
|
ユーザー |
|
提出日時 | 2025-05-30 14:55:40 |
言語 | Rust (1.83.0 + proconio) |
結果 |
AC
|
実行時間 | 2 ms / 2,000 ms |
コード長 | 4,635 bytes |
コンパイル時間 | 13,219 ms |
コンパイル使用メモリ | 403,868 KB |
実行使用メモリ | 7,844 KB |
最終ジャッジ日時 | 2025-05-30 14:55:55 |
合計ジャッジ時間 | 14,128 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 35 |
コンパイルメッセージ
warning: trait `DisplayVec` is never used --> src/main.rs:20:7 | 20 | trait DisplayVec<T> { | ^^^^^^^^^^ | = note: `#[warn(dead_code)]` on by default warning: function `mod_pow` is never used --> src/main.rs:88:4 | 88 | fn mod_pow(num: i64, index_: i64, mod_: i64) -> i64 { | ^^^^^^^ warning: function `combinations` is never used --> src/main.rs:99:4 | 99 | fn combinations<T, F>( | ^^^^^^^^^^^^
ソースコード
#[allow(unused_imports)] use proconio::{ fastout, input, marker::{Chars, Usize1}, }; #[allow(unused_imports)] use std::cmp::{max, min}; #[allow(unused_imports)] use std::collections::{HashMap, HashSet, VecDeque}; #[allow(unused_imports)] use std::fmt::Debug; #[allow(unused_imports)] use std::iter::{Flatten, FromIterator}; #[allow(unused_imports)] use std::ops::Index; #[allow(unused_imports)] use std::vec::IntoIter; use std::{cmp::Reverse, collections::BinaryHeap}; trait DisplayVec<T> { fn print(&self, sep: &str); } impl<T> DisplayVec<T> for Vec<T> where T: ToString, { fn print(&self, sep: &str) { println!( "{}", self.iter() .map(std::string::ToString::to_string) .collect::<Vec<_>>() .join(sep) ) } } #[allow(dead_code)] fn print_chars(input_: &[char]) { println!("{}", &input_.iter().collect::<String>()) } #[allow(dead_code)] fn ctoi(c: &char) -> i32 { *c as i32 - 48 } #[allow(dead_code)] #[allow(non_snake_case)] fn YESNO(res: bool) { if res { println!("YES") } else { println!("NO") } } #[allow(dead_code)] #[allow(non_snake_case)] fn YesNo(res: bool) { if res { println!("Yes") } else { println!("No") } } #[allow(dead_code)] fn yesno(res: bool) { if res { println!("yes") } else { println!("no") } } #[allow(unused_macros)] macro_rules! input_arrays_with_len { ($e:expr, $t:ty) => { (0..$e) .map(|_| { input! { l: u32, nums: [$t; l] } nums }) .collect_vec() }; } fn mod_pow(num: i64, index_: i64, mod_: i64) -> i64 { if index_ == 0 { return 1; } if index_ % 2 == 0 { return mod_pow((num * num) % mod_, index_ / 2, mod_); } else { return num * mod_pow(num, index_ - 1, mod_) % mod_; } } fn combinations<T, F>( origin: &Vec<Vec<T>>, cur_idx: usize, cur_rest: usize, cur_array: &mut Vec<usize>, func: &F, ) -> i64 where F: Fn(&Vec<Vec<T>>, &Vec<usize>) -> bool, { if cur_rest == 0 { return func(origin, &cur_array) as i64; } if cur_idx + cur_rest > origin.len() { return 0; } let mut ans = combinations(origin, cur_idx + 1, cur_rest, cur_array, func); if cur_rest > 0 { cur_array.push(cur_idx); ans += combinations(origin, cur_idx + 1, cur_rest - 1, cur_array, func); cur_array.pop(); } ans } fn main() { input! { n: u8, m: u8, k: u32, goals: [Usize1; k], times: [[i64; n];n], } let mut q = BinaryHeap::new(); let mut dists_min = HashMap::new(); for start in 0..n { q.push(Reverse((0, (1 << start) as i64, start))); dists_min.insert(((1 << start as i64), start), 0); } let goals_bit = goals.iter().map(|idx| 1 << idx).sum::<i64>(); while let Some(Reverse((cur_time, visited_bits, cur_pos))) = q.pop() { if dists_min.get(&(visited_bits, cur_pos)).unwrap_or(&i64::MAX) < &cur_time { continue; } *dists_min.entry((visited_bits, cur_pos)).or_insert(i64::MAX) = cur_time; if ((goals_bit & (1 << cur_pos)) > 0) && (visited_bits.count_ones() >= m as u32) { println!("{}", cur_time); return; } if visited_bits.count_ones() >= m as u32 { for &goal_idx in goals.iter() { let next_time = cur_time + times[cur_pos as usize][goal_idx]; let next_visited = visited_bits | (1 << goal_idx); if dists_min .get(&(next_visited, goal_idx as u8)) .unwrap_or(&i64::MAX) < &next_time { continue; } q.push(Reverse((next_time, next_visited, goal_idx as u8))); } } else { for next_pos in 0..n { if visited_bits & (1 << next_pos) > 0 { continue; } let next_visited = visited_bits | (1 << next_pos); let next_time = cur_time + times[cur_pos as usize][next_pos as usize]; if dists_min .get(&(next_visited, next_pos)) .unwrap_or(&i64::MAX) < &next_time { continue; } q.push(Reverse((next_time, next_visited, next_pos))); } } } }