結果
問題 | No.3041 非対称じゃんけん |
ユーザー |
|
提出日時 | 2025-03-22 16:39:03 |
言語 | Rust (1.83.0 + proconio) |
結果 |
AC
|
実行時間 | 1,780 ms / 2,200 ms |
コード長 | 1,654 bytes |
コンパイル時間 | 21,853 ms |
コンパイル使用メモリ | 382,688 KB |
実行使用メモリ | 7,324 KB |
最終ジャッジ日時 | 2025-03-22 16:39:38 |
合計ジャッジ時間 | 25,700 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 30 |
ソースコード
fn main() {input!{n: usize, _f: usize,a: [u64; n],b: [u64; n],c: [u64; n],}let mut cur_dp = vec![0u128; n+1];cur_dp[0] = 1;// mask値を事前計算(下位桁、上位桁)let mask1 = (1 << 64)-1;let mask2 = !0;// i人for i in 0..n {let mut next_dp = vec![0u128; n+1];// 状態jfor j in 0..=i {// 1つ目の手let next1 = cur_dp[j] << a[i];next_dp[j] |= next1 & mask1;next_dp[j+1] |= (next1 & mask2) >> 64;// 2つ目の手let next2 = cur_dp[j] << b[i];next_dp[j] |= next2 & mask1;next_dp[j+1] |= (next2 & mask2) >> 64;// 3つ目の手let next3 = cur_dp[j] << c[i];next_dp[j] |= next3 & mask1;next_dp[j+1] |= (next3 & mask2) >> 64;}let mut ret = 0;for j in 0..=i {ret += next_dp[j].count_ones();}println!("{}", ret);swap(&mut cur_dp, &mut next_dp);}}// const MOD17: usize = 1000000007;// const MOD93: usize = 998244353;// const INF: usize = 1 << 60;// let dx = vec![!0, 0, 1, 0]; // 上左下右// let dy = vec![0, !0, 0, 1]; // 上左下右// let d = vec!{(!0, 0), (0, !0), (1, 0), (0, 1)}; // 上左下右#[allow(unused)]use proconio::{input, marker::Chars, marker::Usize1};#[allow(unused)]use std::{mem::swap,cmp::min, cmp::max,cmp::Reverse,collections::HashSet, collections::BTreeSet,collections::HashMap, collections::BTreeMap,collections::BinaryHeap,collections::VecDeque,iter::FromIterator,};// 配列のスペース区切り出力#[allow(unused)]fn vec_print<T: std::fmt::Display>(vec: &Vec<T>) {let sz = vec.len();for i in 0..sz-1 {print!("{} ", vec[i]);}println!("{}", vec[sz-1]);}