セグメント木(Segment Tree)
概要
- 要素の更新がありうる数列について、任意区間におけるあらかじめ定義した演算が高速にできる
- 数列の各要素が葉となるような木構造をとる
- 木を構成する各nodeは自身の子node(葉の場合は自分自身)が表現している区間全体についての演算結果を持つ
- 葉の値(数列の要素)を変更した場合、そこから根に向かって各nodeの演算結果を更新していく
- 数列 ] について、ある区間 ] の演算結果を取得したい場合は下記の計算を根から実行する
- 計算時間は要素の更新に 、演算結果の取得に
実装
- 簡単のため数列の各要素は整数とする
- 演算は任意に事前定義可能とする
- 今回は区間内の最小値とする
- 数列の 番目の要素を に更新する関数
Update(i, v)
をもつ - 任意の区間 ] における演算結果を返す関数
Get(l, r)
をもつ
Python3で実装する
Powered by OnlineGDB
Goで実装する
Goでデフォルト引数を使うのは何かとめんどくさいので GetVal(l, r, i)
関数を定義し、 Get(l, r)
関数は GetVal(l, r, 1)
を呼び出すWrapperとした