@hhzhhzhhz
2019-10-06T13:09:13.000000Z
字数 670
阅读 388
构建ST表相当于是一个DP的过程在【l,r】中选取两段(部分重合或首尾相接)的两段中的最大值中选取最值;
【算法分析】
这里用到的是倍增法:
用f[i][j]表示从i开始向后的距离中的最大值。
对于由此逐步拓展到整个数据,就是一个dp的过程
用空间换时间,ST表构建完后,每次查询区间最值用的时间完成
查询方法如图:

板子题:vijos P1514 天才的记忆
直接上代码了
#include<bits/stdc++.h>using namespace std;int n;int f[200010][20];int main() {scanf("%d",&n);for(int i=1; i<=n; i++) {scanf("%d",&f[i][0]);}int m,l,r;int k=2;for(int j=1; j<=19; j++) {for(int i=1; i+k-1<=n; i++) {f[i][j]=max(f[i][j-1],f[i+k/2][j-1]);}k*=2;}scanf("%d",&m);for(int i=1; i<=m; i++) {scanf("%d%d",&l,&r);int t=log(r-l+1)/log(2);//换底公式int x=pow(2,t);printf("%d\n",max(f[l][t],f[r-x+1][t]));//将没有表示过的【l,r】,变为已经表示过的两端}return 0;}