也基于用二进制优化,用于求解RMQ问题,也就是区间最值询问进行O(1)的解决。
fij 表示从区间[i,i+2^j-1]的最大值
于是有动态转移方程
f[i,j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1])
分别是区间[i,i+2^(j-1)-1]和区间[i+2^(j-1),i+2^(j-1)+2^(j-1)-1]
对于任意区间l,r
区间长度r-l+1
可以假设l+2^k-1=r,求解k可以得到k=log2(r-l+1);
所以return
max(f[l][k],f[r-(1<<k)+1][k])即可
对于log2,我们可以进行预处理,也可以直接调用函数
std::__lg
预处理转移方程f[i]=f[i/2]+1