class NgLib::StaticRectangleSum(T)

Overview

不変な二次元配列 $A$ に対して、$\sum_{i=l_i}^{r_i-1} \sum_{j=l_j}^{r_j-1} A_i$ を前計算 $O(N)$ クエリ $O(1)$ で求めます。

Defined in:

nglib/data_structure/static_rectangle_sum.cr

Constructors

Instance Method Summary

Constructor Detail

def self.new(grid : Array(Array(T))) #

[View source]

Instance Method Detail

def [](y_range : Range(Int | Nil, Int | Nil), x_range : Range(Int | Nil, Int | Nil)) : T #

[View source]
def []?(y_range : Range(Int | Nil, Int | Nil), x_range : Range(Int | Nil, Int | Nil)) : T | Nil #

[View source]
def csum : Array(Array(T)) #

[View source]
def get(y_begin : Int, y_end : Int, x_begin : Int, x_end : Int) : T #

累積和を返します。

[y_begin, y_end), [x_begin, x_end) で指定します。

NOTE このAPIは非推奨です。Rangeで指定することが推奨されます。


[View source]
def get(y_range : Range(Int | Nil, Int | Nil), x_range : Range(Int | Nil, Int | Nil)) : T #

累積和を取得します。

Range(y_begin, y_end), Range(x_begin, x_end) で指定します。

csum = StaticRectangleSum.new(a)
csum.get(0...h, j..j + 2) # => 28

[View source]
def get?(y_begin : Int, y_end : Int, x_begin : Int, x_end : Int) : T | Nil #

累積和を返します。

[y_begin, y_end), [x_begin, x_end) で指定します。

範囲内に要素が存在しない場合 nil を返します。

NOTE このAPIは非推奨です。Rangeで指定することが推奨されます。


[View source]
def get?(y_range : Range(Int | Nil, Int | Nil), x_range : Range(Int | Nil, Int | Nil)) : T | Nil #

累積和を返します。

[y_begin, y_end), [x_begin, x_end) で指定します。

範囲内に要素が存在しない場合 nil を返します。

csum = StaticRectangleSum.new(a)
csum.get?(0...h, j..j + 2)     # => 28
csum.get?(0...100*h, j..j + 2) # => nil

[View source]
def height : Int32 #

[View source]
def width : Int32 #

[View source]