倍增
任何整数可以表示为若干个2的幂次之和,在问题的状态空间特别大的时候,可以采用倍增的思想,以2的幂次方位置为关键位置,设计数组含义以及递推算法。
ST创建
根据倍增思想,长度为的区间可以分为两个长度为的区间,通过递推来获得区间最值
递推式:
求出满足的k值,即
void ST_create()
{
for(int i=1;i<=n;i++)
f[i][0]=a[i];//赋初值
int k=log2(n);
for(int j=1;j<=k;j++)//从小区间推大区间
for(int i=1;i<=n-(1<<j)+1;i++)
f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
}
ST查询
若查询区间的最值,首先计算k值,
再查询 和 区间的最值
两区域可能有重叠,但对求最值没有影响
int ST_query(int l,int r)
{
int k=log2(r-l+1);
return max(f[l][k],f[r-(1<<k)+1][k]);
}