码迷,mamicode.com
首页 > 其他好文 > 详细

ST表

时间:2020-01-22 21:43:51      阅读:54      评论:0      收藏:0      [点我收藏+]

标签:最大值   ++i   for   cpp   oid   位置   math   void   log   

\(O(n\ log\ n)\)预处理,\(O(1)\)查询最值

\(f[i][j]\)表示,从\(i\)位置开始的\(2^j\)个数中的最大值,例如\(f[i][0]\)表示的是\(i\)位置的值,\(f[i][1]\)表示的是\(i\)位置和\(i+1\)位置中两个数的最大值

\(code\)

void init()
{
    lg[0]=-1;
    for(int i=1;i<=n;++i) lg[i]=lg[i>>1]+1;
    for(int i=1;i<=n;++i) f[i][0]=a[i];
    for(int j=1;j<=20;++j)
        for(int i=1;i+(1<<j)-1<=n;++i)
            f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
}

......

len=lg[r-l+1];//查询
ans=max(f[l][len],f[r-(1<<len)+1][len]);

ST表

标签:最大值   ++i   for   cpp   oid   位置   math   void   log   

原文地址:https://www.cnblogs.com/lhm-/p/12229486.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!