二次元セグメント木
(data-structure-2d/2d-segment-tree.hpp)
二次元セグメント木
概要
二次元セグメント木とは、二次元配列上において非可換なモノイドに関する演算を計算するときに使用できるデータ構造である。
大きさ $H \times W$ の二次元配列に対して
を $\mathrm{O}(\log H \log W)$ で行うことができる。
使い方
- テンプレート引数
T
: データの型。
- テンプレート引数
F
: モノイドを計算する関数の型。
-
SegmentTree2D(h, w, _f, const T& i)
: コンストラクタ。h,w
は配列の縦横のサイズ、_f
はモノイドを計算する関数、i
はモノイドの単位元が載る。時間・空間ともに $\mathrm{O}(hw)$
-
void init(h, w)
: サイズを $h \times w$ に、要素を単位元 $I$ に初期化する。$\mathrm{O}(hw)$
-
void set(h, w, x)
: 配列を $A$ として $A_{h,w}$ の値を更新する。build
より前に呼ぶ必要がある。 $\mathrm{O}(1)$
-
void build()
: データ構造を構築する。$\mathrm{O}(hw)$
-
T& get(h, w)
, operator()(h, w)
: $A_{h,w}$ の値を取得する。 $\mathrm{O}(1)$
-
void update(h, w, x)
: 配列を $A$ として $A_{h,w}$ の値を更新する。いつでも呼ぶことができる。 $\mathrm{O}(\log H \log W)$
-
void query(h1, w1, h2, w2)
: 区間 $[A_{h_1,w_1}, A_{h2, w2})$ の総積を取得する。$\mathrm{O}(\log H \log W)$
Verified with
Code
Back to top page