跳转至

ST表

\(O(n\log n)\)

解决 RMQ 问题,如静态区间最大值、最小值和 \(\gcd\)

模版
C++
template<class T>
struct SparseTable {
    vector<vector<T>> st;
    vector<int> lg;
    // 传入的 vector 的下标必须以 1 为基础
    SparseTable(const vector<T> &s) {
        const int n = s.size() - 1;
        st.assign(n + 1, vector<T>(22, 0));
        lg.resize(n + 1);
        for (int i = 2 ; i <= n ; i++) {
            lg[i] = lg[i >> 1] + 1;
        }
        for (int i = 1 ; i <= n ; ++i) {
            st[i][0] = s[i];
        }
        for (int j = 1 ; j <= lg[n] ; j++) {
            for (int i = 1 ; i + (1 << j) - 1 <= n ; i++) {
                st[i][j] = max(st[i][j - 1], st[i + (1 << j - 1)][j - 1]);
            }
        }
    }
    T query(int L, int R) {
        int k = lg[R - L + 1];
        return max(st[L][k], st[R - (1 << k) + 1][k]);
    }
}; // SparseTable
例题