ST表学习

啊谈不上学习了。复习一下原理留一下板子。

$f\left[i,j \right]$表示以$i$为起点,区间长度为${2}^{j}$的区间最值。以最小值为例,

$min\left(a\left [ k \right ] | i\leq k\leq i+2^{j}-1\right)$

递推式就是倍增思想,为均分的两段区间的最值。即

$min\left(f\left[i,j-1\right],f\left[i+2^{j-1},j-1\right ]\right)$

预处理复杂度$O\left(nlog_{2}n\right )$

如果询问$L$到$R$区间的最值,它等于两段覆盖它的区间的$min$,即

$min\left(f\left[l,k\right],f\left[r-2^{k}+1,k\right]\right),k=log_{2}\left(R-L+1\right)$

求解的时候是$O\left(1\right )$回答的。

我用了全篇$LaTeX$公式,好无聊啊。。。。

板子

 

int f[N][20],p[20];
void ST(){
    p[0]=1;
    for(int i=1;i<=18;i++)
    p[i]=p[i-1]<<1;
    for(int i=1;i<=n;i++)
    f[i][0]=x[i];
    for(int j=1;j<=18;j++)
    for(int i=1;i+(1<<j)-1<=n;i++)
    f[i][j]=max(f[i][j-1],f[i+p[j-1]][j-1]);
}

 

posted @ 2017-10-23 16:55  orzzz  阅读(145)  评论(0编辑  收藏  举报