Kyopro Library
 
読み取り中…
検索中…
一致する文字列を見つけられません
sparse_table.hpp
[詳解]
1#include"../../kyopro_library/template.hpp"
2
3/// @brief スパーステーブル
4/// @tparam Band 冪等な半群
5template<typename Band>
6struct 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
33private:
34 int n;
35 vector<vector<Type>>dat;
36};
スパーステーブル
Type operator[](int i) const
SparseTable(const vector< Type > &v)
配列 v からスパーステーブルを構築する
Type fold(int l, int r)
区間 [l, r) の半群積を返す
SparseTable()=default