目录
1.概述
2.引入
3.ST表对引入的优化
1.概述
ST表是一种基于树形结构的数据结构,用于处理区间查询和更新操作。它通过预处理的方式将原始数据存储在树状结构中,以支持高效的区间查询。ST表的构建时间复杂度为O(nlogn),其中n为原始数据的长度。但一旦构建完成,可以在O(logn)的时间内进行区间查询和更新操作。
2.引入
给定一个长度为 N 的数列,和 M 次询问,求出每一次询问的区间 [l, r] 中的最大值。
输入:
第一行包含两个整数 N,M,分别表示数列的长度和询问的个数。
第二行包含 N 个整数(记为 ),依次表示数列的第 i 项。
接下来 M 行,每行包含两个整数 l, r,表示查询的区间为 [l, r]。
输出:
每行一个整数,依次表示每一次询问的结果。
暴力解决办法:每次都对区间 [l, r] 扫描一遍,求出最大值。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define lowbit(x) (x & (-x))
void solve() {
int n, m;
cin >> n >> m;
vector<ll> a(n + 1);
for (int i = 1; i <= n; i++) cin >> a[i];
while (m--) {
int l, r;
cin >> l >> r;
ll ans = a[l];
for (int i = l + 1; i <= r; i++) ans = max(ans, a[i]);
cout << ans << endl;
}
}
int main() {
ios::sync_with_stdio;
cin.tie(0);
cout.tie(0);
solve();
return 0;
}
3.ST表对引入的优化
具体实现:
令f(i, j)表示区间[i, ]的最大值,所以f(i, j) = max(f(i, j - 1), f(i + , j - 1))。
所以对于每个区间[l, r] 可以分成两个部分 [l, ]和[, r]两个区间,其中s = 。
由于最大值是可重复贡献问题,重叠并不会对区间最大值产生影响。又因为这两个区间完全覆盖,可以保证答案的正确性。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define lowbit(x) (x & (-x))
const int N = 1e5 + 1;
ll f[N][22], logn[N];
void init(int n) {
logn[1] = 0;
logn[2] = 1;
for (int i = 3; i <= n; i++) logn[i] = logn[i / 2] + 1;
for (int i = 1; i <= n; i++) cin >> f[i][0];
for (int j = 1; j <= logn[n]; 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]);
}
}//初始化
void solve() {
int n, m;
cin >> n >> m;
init(n);
while (m--) {
int l, r;
cin >> l >> r;
int k = logn[r - l + 1];
cout << max(f[l][k], f[r - (1 << k) + 1][k]) << endl;
}
}
int main() {
ios::sync_with_stdio;
cin.tie(0);
cout.tie(0);
solve();
return 0;
}