最近反正学得很杂,做到什么发现还不会就写写吧。(我也不知道我为什么现在还不会ST表)
初始化就是倍增,以前一直不知道怎么查询,一看博客发现世界真奇妙,原来可以通过两个重合了一部分的区间来查询,,,,,,,,,
f[i][j]表示
i开始的长度为
2j的区间的最大(小)值,先初始化
f[i][0]=ai,递推式
f[i][j]=max{ f[i+2j−1][j−1],f[i][j−1] },这个和倍增求LCA差不多。
要求
[l,r]的最大值,可以这样:
k=⌊log2(r−l+1)⌋,则
[l,r]的最大值是
max{ f[l][k],f[r−2k+1][k] }。
但是我也不知道为什么求
⌊log2(r−l+1)⌋和
2k(1<<k
)是
O(1)的(难道不是
O(log)的吗)。
把
log存下来可以优化一些。