Sparse Table(ST表)

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.csdn.net/baodream/article/details/80206556

猜你喜欢

转载自blog.csdn.net/baodream/article/details/80206541