ST表

ST表

\(O(30*n)\)的复杂度内建ST表

int n;  cin>>n;
for(int i=1;i<=n;++i)
    cin>>a[i];
for(int i=1;i<=n;++i)
    st[i][0]=a[i];
for(int j=1;j<=30;++j)
    for(int i=1;i<=n;++i)
        if(i+(1<<(j-1))<=n)
            st[i][j]=max(st[i][j-1],st[i+(1<<(j-1))][j-1]);

查询复杂度为\(O(log(n))\)

int query(int l,int r){
    int len=log2(r-l+1);
    return max(st[l][len],st[r-(1<<len)+1][len]);
}

模板求的是区间最大值,如果需要求最小值,只需要把max()改为min()即可。

posted @ 2020-02-08 19:27  caoanda  阅读(139)  评论(0编辑  收藏  举报