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 ]