ST表

ST表

//使用注意事项:记得调用st.init(),另外记得把aaa[i]换成一个正确的值
struct ST {
    int f[22][N], g[22][N];//将f[N][22]写成f[22][N]可以提升效率,若数组定义为f[n][22],则f[i][j]表示需要查询的数组从下标i到下标i+2^(j-1)的最大值,g[i][j]表示需要查询的数组从下标i到下标i+2^(j-1)的最小值
    int lg[N];
    void init() {
        lg[1] = 0;
        for (int i = 2; i <= n; i++)
            lg[i] = lg[i / 2] + 1;
        for (int i = 1; i <= n; i++) {
            f[0][i] = aaa[i];
            g[0][i] = aaa[i];
        }
        for (int j = 1; j <= 20; j++) {
            for (int i = 1; i + (1LL << j) - 1 <= n; i++) {
                f[j][i] = max(f[j - 1][i], f[j - 1][i + (1LL << (j - 1))]);  //求最大
                g[j][i] = min(g[j - 1][i], g[j - 1][i + (1LL << (j - 1))]);  //求最小
            }
        }
    }
    int ask_max(int l, int r) {
        if (l > r)
            swap(l, r);
        int len = lg[r - l + 1];
        int ans = max(f[len][l], f[len][r - (1 << len) + 1]);
        return ans;
    }
    int ask_min(int l, int r) {
        if (l > r)
            swap(l, r);
        int len = lg[r - l + 1];
        int ans = min(g[len][l], g[len][r - (1 << len) + 1]);
        return ans;
    }
};

Last updated