首页 > 其他 > 详细

[学习笔记]ST表

时间:2017-01-10 21:00:54      阅读:127      评论:0      收藏:0      [点我收藏+]

ST表

给定一个数列$a,O(nlogn)$预处理,$O(1)$查询数列在区间$[l,r]$的最值.

本文介绍求最大值.

实现

  • 预处理

$st[i][j]$表示$max\{a_k\}(k\in[i,i+2^j))$.

$st[i][j]=\begin{cases}a_i&j=0\\max(st[i][j-1],st[i+2^{j-1}][j-1])&j>0\\\end{cases}$

  • 询问

询问$[l,r]$,令$k=\lfloor\;log_2^{r-l+1}\;\rfloor$,则答案为$max(st[l][k],st[r-2^k+1][k])$.

int st[N][K],a[N],log_2[N];
inline void ini_st(){
    log_2[1]=0;
    for(int i=2;i<=n;++i){
        log_2[i]=log_2[i-1];
        if((1<<log_2[i]+1)==i)
            ++log_2[i];
    }
    for(int i=n;i;--i){
        st[i][0]=a[i];
        for(int j=1;(i+(1<<j)-1)<=n;++j)
            st[i][j]=max(st[i][j-1],st[i+(1<<j-1)][j-1]);
    }
}
inline int ask(int l,int r){
    int k=log_2[r-l+1];
    return max(st[l][k],st[r-(1<<k)+1][k]);
}

[学习笔记]ST表

原文:http://www.cnblogs.com/AireenYe/p/6270518.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!