DenseFenwickTree2D
DenseFenwickTree2D は、固定された width × height の格子に対して、点加算と矩形和を処理する密な二次元Fenwick Treeです。
import
import atcoder/extra/structure/dense_fenwicktree_2d
構築
var tree =
initDenseFenwickTree2D[int](
width,
height,
)
座標は (x, y) の順で指定します。
0 <= x < width
0 <= y < height
点加算
tree.add(
x,
y,
delta,
)
prefix和
let prefix =
tree.prefixSum(
xRight,
yRight,
)
対象は半開矩形です。
[0, xRight) × [0, yRight)
矩形和
let answer =
tree.sum(
xLeft,
xRight,
yLeft,
yRight,
)
対象は半開矩形です。
[xLeft, xRight) × [yLeft, yRight)
get(x, y) は一点の値を返し、allSum は全格子の和を返します。
代数的な条件
型 T はzero値に加えて + と - を提供する必要があります。矩形和ではprefix和の差を取るため、加法可換群に相当する演算を前提とします。
計算量
| 操作 | 計算量 |
|---|---|
| 構築 | O(width × height) |
add |
O(log width log height) |
prefixSum |
O(log width log height) |
sum |
O(log width log height) |
get |
O(log width log height) |
allSum |
O(log width log height) |
メモリ使用量は O(width × height) です。