pub struct VecSegtree<M>{ /* private fields */ }Expand description
Vec ベースのセグ木。
非再帰実装かつ配列サイズを $2n$ とするセグ木。 モノイドを対象として要素の取得・更新および任意区間のモノイド積を処理する。 加えて、モノイド積を引数とする述語に対して、それが真となる区間の境界を求められる。
§Complexity
| 演算 | 時間計算量 |
|---|---|
new, from | $\Theta(n)$ |
index | $\Theta(1)$ |
set_value | $\Theta(\log(n))$ |
区間 $[l, r)$ の fold | $\Theta(\log(r-l))$ |
fold_bisect, fold_bisect_rev | $O(\log(n))$ |
§Examples
use nekolib::ds::VecSegtree;
use nekolib::traits::{Fold, FoldBisect, FoldBisectRev, GetMut};
use nekolib::utils::OpAdd;
let mut vs: VecSegtree<OpAdd<i32>> = vec![2, 4, 7, 3, 5].into();
assert_eq!(vs.fold(1..3), 11);
assert_eq!(vs.fold(..), 21);
*vs.get_mut(2).unwrap() = 1; // [2, 4, 1, 3, 5]
assert_eq!(vs.fold(1..3), 5);
assert_eq!(vs.fold(1..=3), 8);
assert_eq!(vs.fold_bisect(1, |&x| x < 4), (1_usize, 0));
assert_eq!(vs.fold_bisect(1, |&x| x <= 4), (2_usize, 4));
assert_eq!(vs.fold_bisect(1, |&x| x < 13), (4_usize, 8));
assert_eq!(vs.fold_bisect(1, |&x| x <= 13), (5_usize, 13));
assert_eq!(vs.fold(..), 15);
assert_eq!(vs.fold_bisect_rev(5, |&x| x <= 0), (5_usize, 0));
assert_eq!(vs.fold_bisect_rev(5, |&x| x < 15), (1_usize, 13));
assert_eq!(vs.fold_bisect_rev(5, |&x| x <= 15), (0_usize, 15));
let l = 1;
let pred = |&x: &i32| x <= 12;
let (r, x) = vs.fold_bisect(l, pred);
assert_eq!(vs.fold(l..r), x);
assert!(pred(&x));
assert!(r == vs.len() || !pred(&vs.fold(l..r + 1)));
let r = 5;
let pred = |&x: &i32| x <= 12;
let (l, x) = vs.fold_bisect_rev(r, pred);
assert_eq!(vs.fold(l..r), x);
assert!(pred(&x));
assert!(l == 0 || !pred(&vs.fold(l - 1..r)));Implementations§
Trait Implementations§
Source§impl<M> Clone for VecSegtree<M>
impl<M> Clone for VecSegtree<M>
Source§fn clone(&self) -> VecSegtree<M>
fn clone(&self) -> VecSegtree<M>
Returns a duplicate of the value. Read more
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreSource§impl<M> Debug for VecSegtree<M>
impl<M> Debug for VecSegtree<M>
Source§impl<M> Default for VecSegtree<M>
impl<M> Default for VecSegtree<M>
Source§impl<M, B> Fold<B> for VecSegtree<M>
impl<M, B> Fold<B> for VecSegtree<M>
Source§impl<M> FoldBisect for VecSegtree<M>
impl<M> FoldBisect for VecSegtree<M>
Source§impl<M> FoldBisectRev for VecSegtree<M>
impl<M> FoldBisectRev for VecSegtree<M>
Source§impl<M> From<VecSegtree<M>> for Vec<M::Set>
impl<M> From<VecSegtree<M>> for Vec<M::Set>
Source§fn from(v: VecSegtree<M>) -> Self
fn from(v: VecSegtree<M>) -> Self
Converts to this type from the input type.
Source§impl<'a, M> GetMut<'a> for VecSegtree<M>
impl<'a, M> GetMut<'a> for VecSegtree<M>
Source§impl<M> Index<usize> for VecSegtree<M>
impl<M> Index<usize> for VecSegtree<M>
Auto Trait Implementations§
impl<M> Freeze for VecSegtree<M>
impl<M> RefUnwindSafe for VecSegtree<M>
impl<M> Send for VecSegtree<M>
impl<M> Sync for VecSegtree<M>
impl<M> Unpin for VecSegtree<M>
impl<M> UnsafeUnpin for VecSegtree<M>
impl<M> UnwindSafe for VecSegtree<M>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more