Kyopro Library
読み取り中…
検索中…
一致する文字列を見つけられません
sparse_table.hpp
[詳解]
1
#
include
"../../kyopro_library/template.hpp"
2
3
/// @brief スパーステーブル
4
/// @tparam Band 冪等な半群
5
template
<
typename
Band>
6
struct
SparseTable
{
7
using
Type=
typename
Band::Type;
8
SparseTable
()=
default
;
9
10
/// @brief 配列 v からスパーステーブルを構築する
11
/// @note O(N log(N))
12
SparseTable
(
const
vector<Type>&v) {
13
n=v.size();
14
dat.assign(__lg(n)+1,vector<Type>(n));
15
dat[0]=v;
16
for
(
int
i=1;i<(
int
)dat.size();i++) {
17
for
(
int
j=0;j+(1<<i)<=n;j++) {
18
dat[i][j]=Band::op(dat[i-1][j],dat[i-1][j+(1<<(i-1))]);
19
}
20
}
21
}
22
23
/// @brief 区間 [l, r) の半群積を返す
24
Type
fold
(
int
l,
int
r) {
25
r--;
26
int
i=__lg(r-l+1);
27
return
Band::op(dat[i][l],dat[i][r-(1<<i)+1]);
28
}
29
30
int
size
() {
return
n;}
31
Type
operator
[](
int
i)
const
{
return
fold
(
i
,
i+1
)
;}
32
33
private
:
34
int
n;
35
vector<vector<Type>>dat;
36
};
SparseTable
スパーステーブル
Definition
sparse_table.hpp:6
SparseTable::operator[]
Type operator[](int i) const
Definition
sparse_table.hpp:31
SparseTable::SparseTable
SparseTable(const vector< Type > &v)
配列 v からスパーステーブルを構築する
Definition
sparse_table.hpp:12
SparseTable::fold
Type fold(int l, int r)
区間 [l, r) の半群積を返す
Definition
sparse_table.hpp:24
SparseTable::size
int size()
Definition
sparse_table.hpp:30
SparseTable::SparseTable
SparseTable()=default
data_structure
sparse_table.hpp
構築:
1.13.2