WaveletMatrix

WaveletMatrix は、静的な整数列に対して、区間内の順位統計や出現回数を高速に求める data structure です。

座標圧縮版の CompressedWaveletMatrix も提供されています。

import

import atcoder/extra/structure/wavelet_matrix

型

type WaveletMatrix[T, MAXLOG]
type CompressedWaveletMatrix[T, MAXLOG]

MAXLOG は扱う値の bit 幅です。

コンストラクタ

proc initWaveletMatrix[T](v: seq[T], MAXLOG: static[int]): WaveletMatrix[T, MAXLOG]
proc initCompressedWaveletMatrix[T](v: seq[T], MAXLOG: static[int]): CompressedWaveletMatrix[T, MAXLOG]

操作

proc access(wm, k): T
proc rank(wm, r, x): int

proc kth_smallest(wm, l, r, k): T
proc kth_largest(wm, l, r, k): T

proc range_freq(wm, l, r, upper): int
proc range_freq(wm, l, r, lower, upper): int

proc prev_value(wm, l, r, upper): T
proc next_value(wm, l, r, lower): T

主な意味は次の通りです。

使用例

let v = @[3, 1, 4, 1, 5, 9, 2, 6]let wm = initWaveletMatrix[int](v, 4)doAssert wm.access(0) == 3doAssert wm.rank(4, 1) == 2doAssert wm.kth_smallest(0, 8, 0) == 1doAssert wm.kth_largest(0, 8, 0) == 9doAssert wm.range_freq(0, 8, 5) == 5

CompressedWaveletMatrix

値が大きい場合や、整数以外の順序付き値を扱いたい場合は CompressedWaveletMatrix を使います。

let v = @[100, 10, 100, 50]let wm = initCompressedWaveletMatrix[int](v, 2)doAssert wm.access(0) == 100doAssert wm.rank(4, 100) == 2

計算量

列長を n、bit 幅を MAXLOG とすると、

です。