Kyopro Library
 
読み取り中…
検索中…
一致する文字列を見つけられません
sparse_table_2d.hpp
[詳解]
1#include"../../kyopro_library/template.hpp"
2
3struct {
4 int h,w;
5 ll sign;
6 ll dat[12][12][1010][1010];
7 ll log_table[5050];
8} SparseTable2D;
9
10void SparseTable2DInit(const vector<vector<ll>>& a, bool is_min=true) {
11 if(!is_min) SparseTable2D.sign=-1;
12 SparseTable2D.h=a.size();
13 SparseTable2D.w=a[0].size();
14 int H=SparseTable2D.h,W=SparseTable2D.w;
15 for(int i=0; i<H; i++) for(int j=0; j<W; j++) SparseTable2D.dat[0][0][i][j]=SparseTable2D.sign*a[i][j];
16 for(int i=2; i<=max(H,W); i++) SparseTable2D.log_table[i]=SparseTable2D.log_table[i/2]+1;
17 for(int k=1; (1<<k)<=H; k++) {
18 for(int i=0; i+(1<<k)<=H; i++) {
19 for(int j=0; j<W; j++) {
20 SparseTable2D.dat[k][0][i][j]=min(
21 SparseTable2D.dat[k-1][0][i][j],
22 SparseTable2D.dat[k-1][0][i+(1<<(k-1))][j]
23 );
24 }
25 }
26 }
27 for(int k=0;(1<<k)<=H;k++) {
28 for(int l=1;(1<<l)<=W;l++) {
29 for(int i=0;i+(1<<k)<=H;i++) {
30 for(int j=0;j+(1<<l)<=W;j++) {
31 SparseTable2D.dat[k][l][i][j]=min(
32 SparseTable2D.dat[k][l-1][i][j],
33 SparseTable2D.dat[k][l-1][i][j+(1<<(l-1))]
34 );
35 }
36 }
37 }
38 }
39}
40
41ll SparseTable2DQuery(int l, int r, int u, int d) {
42 int i=SparseTable2D.log_table[r-l];
43 int j=SparseTable2D.log_table[d-u];
44 return min({
45 SparseTable2D.dat[i][j][l][u],
46 SparseTable2D.dat[i][j][r-(1<<i)][u],
47 SparseTable2D.dat[i][j][l][d-(1<<j)],
48 SparseTable2D.dat[i][j][r-(1<<i)][d-(1<<j)]
49 })*SparseTable2D.sign;
50}
int h
void SparseTable2DInit(const vector< vector< ll > > &a, bool is_min=true)
int w
ll sign
ll dat[12][12][1010][1010]
ll log_table[5050]
ll SparseTable2DQuery(int l, int r, int u, int d)