モノイド $(S, \cdot: S \times S \to S, e \in S)$と、$S$ から $S$ への写像の集合 $F$ であって、以下の条件を満たすようなものについて使用できるデータ構造です。
長さ $N$ の $S$ の配列に対し、
を $O(\log N)$ で行うことが出来ます。詳細な要件は Appendix を参照してください。
また、このライブラリはオラクルとしてop, e, mapping, composition, id
を使用しますが、これらが定数時間で動くものと仮定したときの計算量を記述します。オラクル内部の計算量が $O(f(n))$ である場合はすべての計算量が $O(f(n))$ 倍となります。
(1) var seg = initLazySegTree(n:int, op, e, mapping, composition, id)
var seg = LazySegTreeType(S, F, op, e, mapping, composition, id).init(n)
var seg = LazySegTree.getType(S, F, op, e, mapping, composition, id).init(n)
(2) var seg = initLazySegTree(v:seq[S], op, e, mapping, composition, id)
var seg = LazySegTreeType(S, F, op, e, mapping, composition, id).init(v)
var seg = LazySegTree.getType(S, F, op, e, mapping, composition, id).init(v)
S
S op(S a, S b)
e():S
F
mapping(f:F, x:S):S
composition(f:F, f:F):F
id():F
を定義する必要があります。 詳しくは、使用例や こちら も参照してください。
n
の数列 a
を作ります。初期値は全部e()
です。n = v.len
の数列 a
を作ります。v
の内容が初期値となります。制約
計算量
seg.set(p:int, x:S):void
seg[p:int] = x:S
a[p] = x
制約
計算量
seg.get(p:int):S
seg[p:int]:S
a[p]
を返します。
制約
計算量
seg.prod(l..<r):S
seg[l..<r]:S
op(a[l], ..., a[r - 1])
を、モノイドの性質を満たしていると仮定して計算します。$l = r$ のときは e()
を返します。
制約
計算量
seg.all_prod():S
op(a[0], ..., a[n-1])
を計算します。$n = 0$ のときは e()
を返します。
計算量
(1) seg.apply(p:int, f:F):void
(2) seg.apply(l..<r, f:F):void
a[p] = f(a[p])
i = l..r-1
についてa[i] = f(a[i])
制約
計算量
(1) seg.max_right(l:int, g:(S)->bool):int
(2💻) seg.max_right(l:int, g:(S)->bool):int
g(x:S):bool
を定義する必要があります。segtreeの上で二分探索をします。 S
を引数にとりbool
を返す関数オブジェクトを渡して使用します。 以下の条件を両方満たす r
を(いずれか一つ)返します。
r = l
もしくは g(op(a[l], a[l + 1], ..., a[r - 1])) = true
r = n
もしくは g(op(a[l], a[l + 1], ..., a[r])) = false
g
が単調だとすれば、g(op(a[l], a[l + 1], ..., a[r - 1])) = true
となる最大の r
、と解釈することが可能です。
制約
g
を同じ引数で呼んだ時、返り値は等しい(=副作用はない)g(e()) = true
計算量
(1) seg.min_left(r:int, g:(S)->bool):int
(2💻) int seg.min_left(r:int, g:(S)->bool):int
bool g(S x)
を定義する必要があります。segtreeの上で二分探索をします。 S
を引数にとりbool
を返す関数オブジェクトを渡して使用します。 以下の条件を両方満たす l
を(いずれか一つ)返します。
l = r
もしくは g(op(a[l], a[l + 1], ..., a[r - 1])) = true
l = 0
もしくは g(op(a[l - 1], a[l], ..., a[r - 1])) = false
g
が単調だとすれば、g(op(a[l], a[l + 1], ..., a[r - 1])) = true
となる最小の l
、と解釈することが可能です。
制約
g
を同じ引数で呼んだ時、返り値は等しい(=副作用はない)g(e()) = true
計算量