ST 表
ST 表基于倍增思想,可以做到
ST 表仅适用于 可重复贡献问题 问题。
什么是可重复贡献问题
对于运算
,满足结合律且 ,则对应的区间询问就是一个可重复贡献问题。例如 。像区间和就不具有这个性质。
令
熟悉 C++ 的同学可能知道,std::__lg
可以
以
于是可以写出代码
cpp
for (int i = 1; i <= n; i++) {
st[0][i] = a[i];
}
for (int j = 1; j <= std::__lg(n); j++) {
int tj = 1 << (j - 1), ti = n - tj * 2 + 1;
for (int i = 1; i <= ti; i++) {
st[j][i] = max(st[j - 1][i], st[j - 1][i + tj]);
}
}
for (int i = 1; i <= n; i++) {
st[0][i] = a[i];
}
for (int j = 1; j <= std::__lg(n); j++) {
int tj = 1 << (j - 1), ti = n - tj * 2 + 1;
for (int i = 1; i <= ti; i++) {
st[j][i] = max(st[j - 1][i], st[j - 1][i + tj]);
}
}
记
cpp
int query(int x, int y) {
int s = std::__lg(y - x + 1);
return max(st[s][x], st[s][y - (1 << s) + 1]);
}
int query(int x, int y) {
int s = std::__lg(y - x + 1);
return max(st[s][x], st[s][y - (1 << s) + 1]);
}