线段树:线段树适用于需要频繁修改数组元素且需要实时查询区间信息的情况。由于其具有较快的查询和更新能力,因此适合用于处理动态数据集合的区间查询问题。
ST表:ST表适用于数据确定之后不再更改,但需要大量查询的情况。ST表不支持动态修改操作,一旦数据发生变化,就需要重新进行预处理。
ST表用二维数组存储数据,st[x][y] = z 表示x到y的最大值为z
ST表通常DP来初始化:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
int st_max[n][n];
int arr[n];
memset(st_max,0,sizeof st_max);
for(int i = 0;i < n;++i)
{
cin >> arr[i];
st_max[i][i] = arr[i];
}
for(int i = 0;i < n;++i)
{
for(int j = i+1;j < n;++j) st_max[i][j] = max(arr[j],st_max[i][j-1]);
}
for(int i = 0;i < n;++i)
{
for(int j = i;j < n;++j)
{
cout << st_max[i][j] << " ";
}
cout << endl;
}
return 0;
}
/*
6
1 8 6 4 3 5
*/