Dual Cumulative Sum 2D
DualCumulativeSum2D は、二次元の矩形加算・一点取得を行う imos 構造です。
import
import atcoder/extra/dp/dual_cumulative_sum_2d
使用例
import atcoder/extra/dp/dual_cumulative_sum_2dvar ds = initDualCumulativeSum2D[int](4, 4)ds.add(1 .. 2, 0 .. 1, 10)ds.add(0 .. 3, 3 .. 3, 5)ds.add(2, 2, -4)ds.build()doAssert ds[1, 0] == 10doAssert ds[2, 1] == 10doAssert ds[2, 2] == -4doAssert ds[3, 3] == 5
API
initDualCumulativeSum2D
var ds = initDualCumulativeSum2D[int](W, H)
add
ds.add(x1 .. x2, y1 .. y2, z)ds.add(x, y, z)
閉矩形 [x1, x2] × [y1, y2] に z を加算します。
ds.add(x, y, z) は一点加算です。
build
ds.build()
imos の累積を反映します。
[]
ds[x, y]
座標 (x, y) の値を返します。
半開矩形API
5整数版の add は半開矩形へ値を加算します。
ds.add(
xLeft,
xRight,
yLeft,
yRight,
value,
)
対象領域は次の通りです。
[xLeft, xRight) × [yLeft, yRight)
get(x, y) は ds[x, y] と同じ点取得です。
従来の add(rx, ry, value) は終端を含む Slice APIとして維持されます。
計算量
add:O(1)build:O(W H)- 一点取得:
O(1)