class NgLib::SuccinctBitVector

Overview

SuccinctBitVector は簡易ビットベクトル(簡易辞書、Succinct Indexable Dictionary)を提供するクラスです。

前計算 $O(n / 32)$ で次の操作が $O(1)$ くらいでできます。

例えばこの問題が解けます → D - Sleep Log

Defined in:

nglib/data_structure/succinct_bit_vector.cr

Constructors

Instance Method Summary

Constructor Detail

def self.new(n : Int) #

長さ $n$ のビット列を構築します。

計算量は $O(n / 32)$ です。


[View source]
def self.new(n : Int, &) #

長さ $n$ のビット列を構築します。

ブロックでは $i$ 番目のビットの値を返してください。

計算量は $O(n)$ です。


[View source]

Instance Method Detail

def [](range : Range(Int | Nil, Int | Nil)) : UInt32 #

range の範囲の総和を返します。


[View source]
def [](i) : UInt32 #

$i$ 番目のビットを返します。


[View source]
def build #

総和が計算できるようにデータ構造を構築します。


[View source]
def count_ones(range : Range(Int | Nil, Int | Nil)) : Int32 #

[View source]
def count_ones : Int32 #

[View source]
def count_zeros(range : Range(Int | Nil, Int | Nil)) : Int32 #

[View source]
def count_zeros : Int32 #

[View source]
def kth_bit_index(k) : UInt32 #

$k$ 番目に出現する $1$ の位置を求めます。

言い換えると、$sum(i) = k$ となるような最小の $i$ を返します。

存在しない場合は nil を返します。

本当は $O(1)$ にできるらしいですが、面倒なので $O(\log{n})$ です。


[View source]
def reset(i : Int) #

左から $i$ 番目のビットを 0 にします。

計算量は $O(1)$ です。


[View source]
def set(i : Int) #

左から $i$ 番目のビットを 1 にします。

計算量は $O(1)$ です。


[View source]
def size : UInt32 #

[View source]
def sum(l, r) : UInt32 #

$[l, r)$ の総和を返します。


[View source]
def sum(range : Range(Int | Nil, Int | Nil)) #

range の範囲で総和を返します。


[View source]
def sum(r) : UInt32 #

$[0, r)$ の総和を返します。


[View source]
def sum #

$[0, n)$ の総和を返します。


[View source]