ST表

ST表

主要就是解决RMQ的问题,其预处理的时间复杂度和线段树一样都是o(nlogn),但是在查询方面,线段树是o(mlogn),而ST表可以做到o(1),适用于时间卡得比较死的RMQ问题。

ST表不支持单点修改和区间修改操作,属于离线表。

一下是ST表预处理代码:

    int dp[N][33];//第一维表示N个数,第二维表示2^n次方个数的区间长度
    int n, m;
    n = read(), m = read();
    for (int i = 1; i <= n; i++)dp[i][0] = read();//2^0为1,区间长度为每个数本身
    for (int i = 1; i <= 20; i++)//预处理
        for (int j = 1; j + (1 << i) - 1 <= n; j++)//j+(1<<i)-1为最大区间个数
            //j为区间最左端,(1<<i)为区间个数,-1表示将左边的j也纳入区间
            dp[j][i] = max(dp[j][i - 1], dp[j + (1 << (i - 1))][i - 1]);
            //2^i个数中的最大/小值是分别从两个长度2^(i-1)中的各自的最大/小进行比较的

以下是ST表区间查询代码:

    while (m--) {
        int l, r;
        l = read(), r = read();
        int mid = log2(r - l + 1);//找到区间的个数以及对应的2的幂次数
        cout << max(dp[l][mid], dp[r - (1 << mid) + 1][mid]) << endl;
        //r表示区间右端,(1<<mid)表示区间个数,+1是将左端点r也算入式子
    }

 

 

posted @ 2023-08-02 15:16  DLSQS  阅读(85)  评论(0)    收藏  举报