C++ ST表

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/C20190102/article/details/98488388

最近反正学得很杂,做到什么发现还不会就写写吧。(我也不知道我为什么现在还不会ST表)

初始化就是倍增,以前一直不知道怎么查询,一看博客发现世界真奇妙,原来可以通过两个重合了一部分的区间来查询,,,,,,,,,


f [ i ] [ j ] f[i][j] 表示 i i 开始的长度为 2 j 2^j 的区间的最大(小)值,先初始化 f [ i ] [ 0 ] = a i f[i][0]=a_i ,递推式 f [ i ] [ j ] = max {   f [ i + 2 j 1 ] [ j 1 ] , f [ i ] [ j 1 ]   } f[i][j]=\max\{\ f[i+2^{j-1}][j-1],f[i][j-1]\ \} ,这个和倍增求LCA差不多。

要求 [ l , r ] [l,r] 的最大值,可以这样:
求最值图示
k = log 2 ( r l + 1 ) k=\left\lfloor\log_2\left(r-l+1\right)\right\rfloor ,则 [ l , r ] [l,r] 的最大值是 max {   f [ l ] [ k ] , f [ r 2 k + 1 ] [ k ]   } \max\{\ f[l][k],f[r-2^k+1][k]\ \}
但是我也不知道为什么求 log 2 ( r l + 1 ) \left\lfloor\log_2\left(r-l+1\right)\right\rfloor 2 k 2^k 1<<k)是 O ( 1 ) O(1) 的(难道不是 O ( log ) O(\log) 的吗)。


log \log 存下来可以优化一些。

猜你喜欢

转载自blog.csdn.net/C20190102/article/details/98488388