モノイド (S,⋅:S×S→S,e∈S) と、S から S への写像の集合 F であって、以下の条件を満たすようなものについて使用できるデータ構造です。
-
Fは恒等写像idを含む。つまり、任意の$x∈S$ に対しid(x) = xをみたす。 -
Fは写像の合成について閉じている。つまり、任意のf,g∈Fに対しf∘g∈Fである。 - 任意の
f∈F,x,y∈Sに対しf(x⋅y)=f(x)⋅f(y)をみたす。
長さ N の S の配列に対し、
- 区間の要素に一括で
Fの要素fを作用 (x = f(x)) - 区間の要素の総積の取得
を
また、このライブラリはオラクルとして op, mapping, composition を使用しますが、これらが定数時間で動くものと仮定したときの計算量を記述します。オラクル内部の計算量が
引数の意味は以下の通りです
S: モノイドの型F: 写像の型op:⋅:S×S→Sを計算する関数 Se: モノイドの単位元mapping:f(x)を返す関数composition:f∘gを返す関数id: 恒等写像
public LazySegTree<S, F>(int n, java.util.function.BinaryOperator<S> op, S e, java.util.function.BiFunction<F, S, S> mapping, java.util.function.BinaryOperator<F> composition, F id)長さ n の配列 a[0], a[1], ..., a[n - 1] を作ります. 初期値はすべて
計算量:
public LazySegTree<S, F>(S[] dat, java.util.function.BinaryOperator<S> op, S e, java.util.function.BiFunction<F, S, S> mapping, java.util.function.BinaryOperator<F> composition, F id)長さ n の配列 a[0], a[1], ..., a[n - 1] を dat により初期化します.
計算量:
public void set(int p, S x)a[p]=x とします.
計算量:
制約: 0 <= p < n
public S get(int p)a[p] を取得します.
計算量:
制約: 0 <= p < n
public S prod(int l, int r)op(a[l], ..., a[r - 1]) を、モノイドの性質を満たしていると仮定して計算します。l = r のときは単位元 e を返します。
計算量:
制約: 0 <= l <= r <= n
public S allProd()op(a[0], ..., a[n - 1]) を、モノイドの性質を満たしていると仮定して計算します。n = 0 のときは単位元 e を返します。
計算量:
// (1)
public void apply(int p, F f)
// (2)
public void apply(int l, int r, F f)- (1):
a[p]に作用素fを作用させます - (2):
i∈[l, r)に対してa[i]に作用素fを作用させます
制約
- (1):
0 <= p < n - (2):
0 <= l <= r <= n
計算量
public int maxRight(int l, java.util.function.Predicate<S> f)S を引数にとり boolean を返す関数を渡して使用します。
以下の条件を両方満たす r を (いずれか一つ) 返します。
r = lもしくはf(op(a[l], a[l + 1], ..., a[r - 1])) = truer = nもしくはf(op(a[l], a[l + 1], ..., a[r])) = false
f が単調だとすれば、f(op(a[l], a[l + 1], ..., a[r - 1])) = true となる最大の r、と解釈することが可能です。
制約
fを同じ引数で呼んだ時、返り値は等しい(=副作用はない)f(e) = true0 <= l <= n計算量
public int minLeft(int r, java.util.function.Predicate<S> f)S を引数にとり boolean を返す関数オブジェクトを渡して使用します。
以下の条件を両方満たす l を (いずれか一つ) 返します。
l = rもしくはf(op(a[l], a[l + 1], ..., a[r - 1])) = truel = 0もしくはf(op(a[l - 1], a[l + 1], ..., a[r - 1])) = false
fが単調だとすれば、f(op(a[l], a[l + 1], ..., a[r - 1])) = true となる最小の l、と解釈することが可能です。
制約
fを同じ引数で呼んだ時、返り値は等しい(=副作用はない)f(e) = true0 <= r <= n
計算量