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