ST表

偶尔善良 提交于 2020-02-08 20:25:23

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()即可。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!