bouzuya/bbna の進捗はイマイチ。
blog.bouzuya.net の API の検証をしてみた。
articles か entries か posts かを数ヶ月に 1 回くらい調べている気がする。ぼくは次は entries にしよう。忘れるので宣言しておこう。
ABC340 : 鹿島建設プログラミングコンテスト2024(AtCoder Beginner Contest 340)
- E - Mancala 2
https://atcoder.jp/contests/abc340/tasks/abc340_e
- 提出: https://atcoder.jp/contests/abc340/submissions/50269719
- 区間加算・遅延セグメント木
A_{B_i}
がN
を超えている分は周回するのでA_{B_i} / N
をA
のすべての要素に足せばいい- 残りについては
B_i
の次の要素からA_{B_i} % N
個分に1
ずつ足せばいい - 遅延セグ木を素朴に使えれば解ける
use ac_library::{LazySegtree, MapMonoid, Monoid}; use proconio::input; fn main() { input! { n: usize, m: usize, a: [usize; n], b: [usize; m], }; struct M(usize); impl Monoid for M { type S = usize; fn identity() -> Self::S { 0_usize } fn binary_operation(a: &Self::S, b: &Self::S) -> Self::S { a + b } } #[derive(Clone, Copy, Debug)] struct F(usize); impl MapMonoid for F { type M = M; type F = F; fn identity_map() -> Self::F { F(0) } fn mapping( f: &Self::F, x: &<Self::M as ac_library::Monoid>::S, ) -> <Self::M as ac_library::Monoid>::S { f.0 + x } fn composition(f: &Self::F, g: &Self::F) -> Self::F { F(f.0 + g.0) } } let mut lst = LazySegtree::<F>::new(n); for (i, a_i) in a.iter().copied().enumerate() { lst.set(i, a_i); } for b_i in b { let v = lst.get(b_i); lst.set(b_i, 0); lst.apply_range(0..n, F(v / n)); let v = v % n; if v > 0 { if b_i == n - 1 { lst.apply_range(0..v, F(1)); } else if b_i + 1 + v <= n { lst.apply_range(b_i + 1..b_i + 1 + v, F(1)); } else { lst.apply_range(b_i + 1..n, F(1)); lst.apply_range(0..(b_i + 1 + v) % n, F(1)); } } } for i in 0..n { let x = lst.get(i); println!("{}", x); } }
今日のコミット。
- bbna 2 commits
- rust-atcoder 1 commit