模板

SparseTable,俗称ST表,其功能,就是静态的RMQ(区间最值查询)问题的解决。注意传入查询的时候两个参数的合法性,或者可以进行一次全部初始化来使得越界值不产生负面影响。不过访问越界是写程序的不良习惯,不应该指望进行一次额外的初始化把它消除。再重申一次对任何位置的访问都要保证不越界。有一些加了某个值之后就会越界。既然是模板那就写多两行预防以后的问题吧(比如某个整除分块也有类似的隐藏bug)。实际应用的时候可以删除提高性能。

时间复杂度:
初始化1:O(MAXN)
初始化2:O(nlogn)
查询:O(1)

空间复杂度:
O(NAXNlogMAXN)

struct SparseTable {
    static const int MAXLOGN = 19;
    static const int MAXN = 200000;
    int n, logn[MAXN + 5];
    int f[MAXN + 5][MAXLOGN + 1];

    void Init1() {
        logn[1] = 0;
        for(int i = 2; i <= MAXN; i++)
            logn[i] = logn[i >> 1] + 1;
    }

    void Init2(int _n) {
        n = _n;
        for(int i = 1; i <= n; i++)
            f[i][0] = a[i];
        for(int j = 1, maxlogn = logn[n]; j <= maxlogn; j++) {
            for(int i = 1; i + (1 << j) - 1 <= n; i++)
                f[i][j] = max(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
        }
    }

    int Query(int l, int r) {
        l = max(1, l), r = min(n, r);
        if(l > r)
            exit(-1);
        int s = logn[r - l + 1];
        return max(f[l][s], f[r - (1 << s) + 1][s]);
    }
} st;
原文地址:https://www.cnblogs.com/KisekiPurin2019/p/11854489.html