ST

原理

见《进阶指南》第41页。

预处理

记录从个数的最大值。

状态转移方程:

两个上界:

  • 得,

  • 得,

查询

下文以len表示待查询区间的长度。

  • 当待查询区间的长度是2的非负整数次幂时,

  • 当待查询区间的长度不是2的非负整数次幂时,

时间复杂度

预处理:

查询:

模板题

洛谷-P3865-【模板】ST表open in new window

#include <iostream>
#include <cmath>
using namespace std;

const int N = 100010;
int n, q;
int a[N], f[N][20];

void ST_create () {
    for (int i = 1; i <= n; ++ i) f[i][0] = a[i];
    int k = log(n) / log(2);
    for (int j = 1; j <= k; ++ j)
        for (int i = 1; i <= n - (1 << j) + 1; ++ i)
            f[i][j] = max(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
}
int ST_query (int l, int r) {
    int k = log(r - l + 1) / log(2);
    return max(f[l][k], f[r - (1 << k) + 1][k]);
}

int main () {
    scanf("%d%d", &n, &q);
    for (int i = 1; i <= n; ++ i) scanf("%d", &a[i]);

    ST_create();
    while (q --) {
        int l, r;
        scanf("%d%d", &l, &r);
        printf("%d\n", ST_query(l, r));
    }
    return 0;
}
最后修改于: