algo — C++23 日本語リファレンス GitHub

PrefixSum2D

クラス · 二次元累積和

template <class T = std::int64_t, bool RangeAdd = false>
struct PrefixSum2D;

概要

二次元累積和

テンプレートパラメータ

名前 説明
T 値の型
RangeAdd true なら矩形加算(差分配列)、false なら点更新として構築する。

構築・破棄

名前 説明 計算量
(constructor) (1) 空の二次元累積和を構築する
(2) n行m列の0初期化された表を構築する
(3) 二次元配列から累積和を構築する
(1) $O(1)$
(2) $O(nm)$
(3) 行数を $n$、列数を $m$ として $O(nm)$

メンバ関数

名前 説明 計算量
set v[x][y] = val(build 前のみ有効) $O(1)$
add (1) v[x][y] += val(build 前のみ有効)
(2) 半開矩形 $[x_1,x_2)\times[y_1,y_2)$ へ val を加算する(build 前のみ有効)
$O(1)$
build build前の値から二次元累積和を構築する $O(nm)$
get v[x][y]を返す $O(1)$
sum (1) 接頭辞矩形 $[0,x)\times[0,y)$ の総和を返す
(2) 半開矩形 $[x_1,x_2)\times[y_1,y_2)$ の総和を返す
$O(1)$

メンバの詳細

(constructor)

// (1)
PrefixSum2D();

// (2)
PrefixSum2D(int _n, int _m);

// (3)
template <class U>
PrefixSum2D(const std::vector<std::vector<U>> &v);

(1) 空の二次元累積和を構築する

(2) n行m列の0初期化された表を構築する

(3) 二次元配列から累積和を構築する

add

// (1)
void add(int x, int y, T val);

// (2)
void add(int x1, int y1, int x2, int y2, T val) requires RangeAdd;

(1) v[x][y] += val(build 前のみ有効)

(2) 半開矩形 $[x_1,x_2)\times[y_1,y_2)$ へ val を加算する(build 前のみ有効)

sum

// (1)
T sum(int x, int y) const;

// (2)
T sum(int x1, int y1, int x2, int y2) const;

(1) 接頭辞矩形 $[0,x)\times[0,y)$ の総和を返す

(2) 半開矩形 $[x_1,x_2)\times[y_1,y_2)$ の総和を返す