View on GitHub

cp-library

遅延セグメント木

C++ 用ライブラリ一覧に戻る

ソースコード

nachia/array/lazy-segtree.hpp

主な機能

モノイドの要素列を二分木で管理することで、要素を 1 つ書き換える変更と、任意の区間の集約値の取得を高速に処理できる。また、要素を更新する作用を遅延伝播することで区間に対する一括更新を高速にする。

AtCoder Library との違いは、単位元 e および恒等写像 id をテンプレート引数ではなくコンストラクタで設定することである。

以下、

構造体テンプレート LazySegtree

テンプレート引数

template<
    class S,
    class F,
    S op(S l, S r),
    F composition(F f, F x),
    S mapping(F f, S x)
>
struct LazySegtree;

を与える。

以降、 S および F の要素のコピーは $O(1)$ 時間で行えるとする。また、 op, composition , mapping の計算量は $O(1)$ として数える。

コンストラクタ

LazySegtree();    // (0)
LazySegtree(int n, S e, F id);   // (1)
LazySegtree(const std::vector<S>& a, S e, F id) ;   // (2)

set

void set(int p, S x);

単一の要素への操作。 a[p] = x に相当する。

get

S get(int p);

a[p] を取得する。

apply

void apply(int p, F f);       // (1)
void apply(int l, int r, F f); // (2)

(1) : $a[p]$ の値を $f(a[p])$ で置き換える。

(2) : $i=l,l+1,\ldots ,r-1$ について、 $a[i]$ の値を $f(a[i])$ で置き換える。

prod

S prod(int l, int r) const;

$a[l]+a[l+1]+\cdots +a[r-1]$ を返す。 $l=r$ ならば $e$ を返す。

allProd

S allProd() const;

$a[0]+a[1]+\cdots +a[n-1]$ を返す。 $n=0$ ならば $e$ を返す。

minLeft

template<class E>
int minLeft(int r, E cmp);

セグメント木上の二分探索によって、以下の条件をすべて満たすような整数 $l$ を一つ求める。

maxRight

template<class E>
int maxRight(int l, E cmp);

セグメント木上の二分探索によって、以下の条件をすべて満たすような整数 $r$ を一つ求める。


TOP PAGE