pub struct DualSegmentTree<T, F> { /* private fields */ }Expand description
半開区間への作用と一点取得を扱う双対セグメント木です。
添字は 0-indexed、区間は [left, right) です。compose(old, new) は古い作用の後に
新しい作用を適用した合成を返し、結合則と単位元 identity を満たす必要があります。
作用が非可換でも、この順序を守れば扱えます。更新と取得はいずれも O(log N) です。
§Examples
use atcoder::data_structure::dual_segment_tree::DualSegmentTree;
let mut tree = DualSegmentTree::new(|a, b| a + b, 4, 0);
tree.apply(1, 4, 3);
tree.apply(2, 3, 2);
assert_eq!(tree.get(2), 5);Implementations§
Source§impl<T: Copy, F: Fn(T, T) -> T> DualSegmentTree<T, F>
impl<T: Copy, F: Fn(T, T) -> T> DualSegmentTree<T, F>
Sourcepub fn new(compose: F, len: usize, identity: T) -> Self
pub fn new(compose: F, len: usize, identity: T) -> Self
長さ len、各点の初期値が identity の木を作ります。計算量・メモリ量は O(N) です。
compose(old, new) は、点に蓄積済みの作用 old の後に新しい作用 new を
適用した合成を返す関数です。identity はこの関数の単位元である必要があります。
Sourcepub fn from_vec(values: impl Into<Vec<T>>, compose: F, identity: T) -> Self
pub fn from_vec(values: impl Into<Vec<T>>, compose: F, identity: T) -> Self
各点の初期値を指定して木を構築します。計算量・メモリ量は O(N) です。
values[i] が添字 i の初期値になります。compose と identity の条件は
new と同じです。
Sourcepub fn from(compose: F, values: Vec<T>, identity: T) -> Self
pub fn from(compose: F, values: Vec<T>, identity: T) -> Self
from_vec と同じです。各点の初期値を values で指定します。
Sourcepub fn apply(&mut self, left: usize, right: usize, value: T)
pub fn apply(&mut self, left: usize, right: usize, value: T)
半開区間 [left, right) の各点に value を適用します。
添字は 0 始まりです。範囲が 0..=len を外れる、または left > right の場合は
panic します。空区間なら何もしません。各点では既存の作用の後に value を適用します。
計算量は O(log N) です。
Trait Implementations§
Auto Trait Implementations§
impl<T, F> Freeze for DualSegmentTree<T, F>
impl<T, F> RefUnwindSafe for DualSegmentTree<T, F>where
F: RefUnwindSafe,
T: RefUnwindSafe,
impl<T, F> Send for DualSegmentTree<T, F>
impl<T, F> Sync for DualSegmentTree<T, F>
impl<T, F> Unpin for DualSegmentTree<T, F>
impl<T, F> UnsafeUnpin for DualSegmentTree<T, F>where
F: UnsafeUnpin,
T: UnsafeUnpin,
impl<T, F> UnwindSafe for DualSegmentTree<T, F>where
F: UnwindSafe,
T: UnwindSafe,
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