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

WaveletMatrixRectangleSum

クラス · キー区間に含まれる重みの総和も扱うウェーブレット行列

template <class T, class U = T, int L = 30>
struct WaveletMatrixRectangleSum : private internal::WaveletMatrixCore<internal::bit_vector, T, L>;

概要

キー区間に含まれる重みの総和も扱うウェーブレット行列

計算量

構築・破棄

名前 説明 計算量
(constructor) (1) 空の重み付きウェーブレット行列を作る
(2) キー列 v と対応する重み列 u から構築する
(1) $O(1)$
(2) $O(nL)$

メンバ関数

名前 説明 計算量
total_sum 区間 $[l,r)$ の重みの総和を返す $O(1)$
kth_smallest_sum 区間 $[l,r)$ のキーが小さい方から k 個の重みの総和を返す $O(L)$
kth_largest_sum 区間 $[l,r)$ のキーが大きい方から k 個の重みの総和を返す $O(L)$
range_sum (1) 区間 $[0,r)$ でキーが x と等しい要素の重みの総和を返す
(2) 区間 $[l,r)$ でキーが x と等しい要素の重みの総和を返す
$O(L)$
rect_sum (1) 区間 $[l,r)$ でキーが upper 未満の要素の重みの総和を返す
(2) 区間 $[l,r)$ でキーが $[lower,upper)$ 内の要素の重みの総和を返す
$O(L)$
rect_count_sum 区間 $[l,r)$ でキーが upper 未満の要素数と重みの総和を返す $O(L)$

メンバ型

名前 説明 計算量
Base 共通実装の基底型 型エイリアスのため実行時コストなし
length 要素数を保持する基底クラスのメンバ $O(1)$ で参照可能
matrix 各レベルのビットベクトルを保持する基底クラスのメンバ 1 レベルの参照は $O(1)$
mid 各レベルの 0 の個数を保持する基底クラスのメンバ 1 レベルの参照は $O(1)$
succ あるビットを選んだ後の区間へ写す基底クラスの補助関数 $O(1)$

メンバの詳細

(constructor)

// (1)
WaveletMatrixRectangleSum() = default;

// (2)
template <class Value>
WaveletMatrixRectangleSum(const std::vector<T> &v, const std::vector<Value> &u);

(1) 空の重み付きウェーブレット行列を作る

(2) キー列 v と対応する重み列 u から構築する

kth_smallest_sum

U kth_smallest_sum(int l, int r, int k) const;

区間 $[l,r)$ のキーが小さい方から k 個の重みの総和を返す

U == T かつ u == v なら、k 個の最小値の総和になる。

kth_largest_sum

U kth_largest_sum(int l, int r, int k) const;

区間 $[l,r)$ のキーが大きい方から k 個の重みの総和を返す

U == T かつ u == v なら、k 個の最大値の総和になる。

range_sum

// (1)
U range_sum(int r, T x) const;

// (2)
U range_sum(int l, int r, T x) const;

(1) 区間 $[0,r)$ でキーが x と等しい要素の重みの総和を返す

(2) 区間 $[l,r)$ でキーが x と等しい要素の重みの総和を返す

rect_sum

// (1)
U rect_sum(int l, int r, T upper) const;

// (2)
U rect_sum(int l, int r, T lower, T upper) const;

(1) 区間 $[l,r)$ でキーが upper 未満の要素の重みの総和を返す

(2) 区間 $[l,r)$ でキーが $[lower,upper)$ 内の要素の重みの総和を返す