口が痛い。 Slay the Spire をプレイしたい気持ちが戻ってきている。
bouzuya/genpi に crates:tracing を入れて動きを確認している。
- Lazy Segment Tree (AtCoder Library Practice Contest:L問題)
https://atcoder.jp/contests/practice2/tasks/practice2_l
- https://atcoder.jp/contests/practice2/submissions/45710854
- 解説 AC
- lazysegtree
- 値データは 0 の個数・ 1 の個数・転倒数を把握していれば OK
use lazysegtree::*; use proconio::input; use segtree::*; fn main() { input! { n: usize, q: usize, a: [usize; n], tlr: [(usize, usize, usize); q], } type M = (usize, usize, usize); impl Monoid for M { type S = M; fn identity() -> Self::S { (0, 0, 0) } fn binary_operation(a: &Self::S, b: &Self::S) -> Self::S { (a.0 + b.0, a.1 + b.1, a.2 + b.2 + a.1 * b.0) } } struct F; impl MapMonoid for F { type M = M; type F = bool; fn identity_map() -> Self::F { false } fn mapping(&f: &Self::F, &x: &<Self::M as Monoid>::S) -> <Self::M as Monoid>::S { if f { (x.1, x.0, x.0 * x.1 - x.2) } else { x } } fn composition(&f: &Self::F, &g: &Self::F) -> Self::F { f ^ g } } let mut lazysegtree = LazySegtree::<F>::new(n); for (i, a_i) in a.iter().copied().enumerate() { lazysegtree.set(i, (1 - a_i, a_i, 0)); } for (t, l, r) in tlr { match t { 1 => { lazysegtree.apply_range(l - 1..r, true); } 2 => { println!("{}", lazysegtree.prod(l - 1..r).2); } _ => unreachable!(), } } } // lazysegtree
今日のコミット。
- rust-atcoder 1 commit
- genpi 3 commits