模板 - 数据结构 - ST表/SparseTable
SparseTable,俗称ST表,其功能,就是静态的RMQ(区间最值查询)问题的解决。注意传入查询的时候两个参数的合法性,或者可以进行一次全部初始化来使得越界值不产生负面影响。不过访问越界是写程序的不良习惯,不应该指望进行一次额外的初始化把它消除。再重申一次对任何位置的访问都要保证不越界。有一些加了某个值之后就会越界。既然是模板那就写多两行预防以后的问题吧(比如某个整除分块也有类似的隐藏bug)。实际应用的时候可以删除提高性能。
时间复杂度:
初始化1:O(MAXN)
初始化2:O(nlogn)
查询:O(1)
空间复杂度:
O(NAXNlogMAXN)
struct SparseTable {
static const int MAXLOGN = 19;
static const int MAXN = 200000;
int n, logn[MAXN + 5];
int f[MAXN + 5][MAXLOGN + 1];
void Init1() {
logn[1] = 0;
for(int i = 2; i <= MAXN; i++)
logn[i] = logn[i >> 1] + 1;
}
void Init2(int _n) {
n = _n;
for(int i = 1; i <= n; i++)
f[i][0] = a[i];
for(int j = 1, maxlogn = logn[n]; j <= maxlogn; j++) {
for(int i = 1; i + (1 << j) - 1 <= n; i++)
f[i][j] = max(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
}
}
int Query(int l, int r) {
l = max(1, l), r = min(n, r);
if(l > r)
exit(-1);
int s = logn[r - l + 1];
return max(f[l][s], f[r - (1 << s) + 1][s]);
}
} st;