結果
問題 | No.2617 容量3のナップザック |
ユーザー | akakimidori |
提出日時 | 2024-01-26 23:00:37 |
言語 | Rust (1.83.0 + proconio) |
結果 |
AC
|
実行時間 | 169 ms / 2,000 ms |
コード長 | 3,911 bytes |
コンパイル時間 | 12,862 ms |
コンパイル使用メモリ | 388,956 KB |
実行使用メモリ | 35,848 KB |
最終ジャッジ日時 | 2024-09-28 08:51:01 |
合計ジャッジ時間 | 17,477 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 40 |
コンパイルメッセージ
warning: unused import: `std::io::Write` --> src/main.rs:2:5 | 2 | use std::io::Write; | ^^^^^^^^^^^^^^ | = note: `#[warn(unused_imports)]` on by default warning: type alias `Map` is never used --> src/main.rs:4:6 | 4 | type Map<K, V> = BTreeMap<K, V>; | ^^^ | = note: `#[warn(dead_code)]` on by default warning: type alias `Set` is never used --> src/main.rs:5:6 | 5 | type Set<T> = BTreeSet<T>; | ^^^ warning: type alias `Deque` is never used --> src/main.rs:6:6 | 6 | type Deque<T> = VecDeque<T>; | ^^^^^
ソースコード
use std::collections::*; use std::io::Write; type Map<K, V> = BTreeMap<K, V>; type Set<T> = BTreeSet<T>; type Deque<T> = VecDeque<T>; fn main() { input! { n: usize, k: i64, seed: i64, a: i64, b: i64, m: i64, } let mut f = vec![0; 2 * n]; f[0] = seed; for i in 1..f.len() { f[i] = (a * f[i - 1] + b) % m; } let mut item = vec![vec![]; 4]; for (a, b) in f.iter().zip(f[n..].iter()) { let w = (*a % 3 + 1) as usize; let v = *b * w as i64; item[w].push(v); } for p in item.iter_mut() { p.sort(); } let one = &item[1]; let two = &item[2]; let three = &item[3]; let mut ans = 0; for r in 0..3 { let mut one = one.clone(); let mut two = two.clone(); let mut geta = 0; for _ in 0..r { geta += two.pop().unwrap_or(0); geta += one.pop().unwrap_or(0); } let mut k = k - r; let mut one = one .rchunks(3) .map(|one| one.iter().sum::<i64>()) .rev() .collect::<Vec<_>>(); let mut x = one.len(); let mut y = three.len(); while k > 0 && (x > 0 || y > 0) { if x > 0 && (y == 0 || one[x - 1] >= three[y - 1]) { k -= 1; x -= 1; geta += one[x]; } else { k -= 1; y -= 1; geta += three[y]; } } ans = ans.max(geta); let two = two .rchunks(3) .map(|two| two.iter().sum::<i64>()) .rev() .collect::<Vec<_>>(); for t in two.iter().rev() { k -= 2; geta += *t; if x == one.len() { k -= 1; if x > 0 { x -= 1; geta += one[x]; } } one.pop(); while k < 0 && (x < one.len() || y < three.len()) { k += 1; if x < one.len() && (y == three.len() || one[x] <= three[y]) { geta -= one[x]; x += 1; } else { geta -= three[y]; y += 1; } } if k >= 0 { ans = ans.max(geta); } } } println!("{}", ans); } // ---------- begin input macro ---------- // reference: https://qiita.com/tanakh/items/0ba42c7ca36cd29d0ac8 #[macro_export] macro_rules! input { (source = $s:expr, $($r:tt)*) => { let mut iter = $s.split_whitespace(); input_inner!{iter, $($r)*} }; ($($r:tt)*) => { let s = { use std::io::Read; let mut s = String::new(); std::io::stdin().read_to_string(&mut s).unwrap(); s }; let mut iter = s.split_whitespace(); input_inner!{iter, $($r)*} }; } #[macro_export] macro_rules! input_inner { ($iter:expr) => {}; ($iter:expr, ) => {}; ($iter:expr, $var:ident : $t:tt $($r:tt)*) => { let $var = read_value!($iter, $t); input_inner!{$iter $($r)*} }; } #[macro_export] macro_rules! read_value { ($iter:expr, ( $($t:tt),* )) => { ( $(read_value!($iter, $t)),* ) }; ($iter:expr, [ $t:tt ; $len:expr ]) => { (0..$len).map(|_| read_value!($iter, $t)).collect::<Vec<_>>() }; ($iter:expr, chars) => { read_value!($iter, String).chars().collect::<Vec<char>>() }; ($iter:expr, bytes) => { read_value!($iter, String).bytes().collect::<Vec<u8>>() }; ($iter:expr, usize1) => { read_value!($iter, usize) - 1 }; ($iter:expr, $t:ty) => { $iter.next().unwrap().parse::<$t>().expect("Parse error") }; } // ---------- end input macro ----------