モノイド
-
結合律:
$\forall a,b,c∈S, (a⋅b)⋅c = a⋅(b⋅c)$ -
単位元の存在:
$\forall a∈S, a⋅e = e⋅a = a$ を満たす代数構造に対し使用できるデータ構造です。
長さ
- 要素の 1 点変更
- 区間の要素の総積の取得
を
また、このライブラリはオラクルとして op を使用しますが、これらが定数時間で動くものと仮定したときの計算量を記述します。オラクル内部の計算量が
public SegTree(int n, java.util.function.BinaryOperator<S> op, S e)長さ
計算量:
public SegTree(S[] dat, java.util.function.BinaryOperator<S> op, S e)長さ 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 を返します。
計算量:
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
計算量