Sparse Table(ST表)

本文介绍了一种使用ST表进行区间最值查询的方法。通过预处理,可在O(nlogn)的时间复杂度完成初始化,并实现O(1)时间复杂度的查询操作。文中详细解释了如何构造ST表以及如何利用它来求解区间最小值与最大值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ST表模板

//ST表预处理O(nlogn),查询O(1),但不支持在线修改
//dp [ i, j ]表示[ i, i+2^j-1]这个区间内的最值
//把dp [i,j]平均分成两段(因为dp [ i,j ]一定是偶数个数字)。
//从 i 到i + 2 ^ (j - 1) - 1为一段,i + 2 ^ (j - 1)到i + 2 ^ j - 1为一段(长度都为2 ^ (j - 1))。
int dpMin[50005][20],dpMax[50005][20];
int a[50005];
int n,q;

void Init()
{
    for(int i=1;i<=n;i++)
        dpMin[i][0] = dpMax[i][0] = a[i];
    for (int j=1;j<=log(n)/log(2);j++)   //只能j在外,i在内
    {
        for(int i=1;i<=n;i++)
        {
            if (i+(1<<j)-1<=n)
            {
                dpMin[i][j]=min(dpMin[i][j-1],dpMin[i+(1<<(j-1))][j-1]);
                dpMax[i][j]=max(dpMax[i][j-1],dpMax[i+(1<<(j-1))][j-1]);
            }
            else
                break;
        }
    }
}

int ST_min(int l,int r)
{
    int k=log(r-l+1)/log(2.0);
    return min(dpMin[l][k],dpMin[r-(1<<k)+1][k]);
}

int ST_max(int l,int r)
{
    int k=log(r-l+1)/log(2.0);
    return max(dpMax[l][k],dpMax[r-(1<<k)+1][k]);
}

模板题:https://blog.youkuaiyun.com/baodream/article/details/80206556

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值