日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

ST表

發布時間:2023/12/24 windows 28 coder
生活随笔 收集整理的這篇文章主要介紹了 ST表 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

\(n\)表示數組長度,\(lg[i]\)表示\(log_2i\)\(st[i][j]\)表示區間\([i, i+2^j-1]\)的詢問值。

構造函數中預處理出\(lg\)\(st\),時間復雜度:\(O(nlogn)\)

\(query(l,r)\)表示求區間\([l,r]\)的詢問值,時間復雜度:\(O(logn)\)

支持高效區間查詢,不支持區間修改。

template <typename T>
class SparseTable 
{
public:
    using func_type = function<T(const T &, const T &)>;
    int n;
    vector<vector<T>> st;
    vector<int> lg;
    static T default_func(const T &a, const T &b) {return max(a, b);}
    func_type op;
    SparseTable(const vector<T> &v, func_type _func = default_func) 
    {
        n = v.size() - 1, op = _func;
        lg.assign(n + 1, 0);
        st.assign(n + 1, vector<T>(20));
        for (int i = 0; 1 << i <= n; i++) lg[1 << i] = i;
        for (int i = 1; i <= n; i++) 
        {
            if (!lg[i]) lg[i] = lg[i - 1];
            st[i][0] = v[i];
        }
        for (int j = 1; 1 << j <= n; j++)
            for (int i = 1; i + (1 << j) - 1 <= n; i++)
                st[i][j] = op(st[i][j - 1], st[i + (1 << j - 1)][j - 1]);
    }

    T query(int l, int r) 
    {
        int k = lg[r - l + 1];
        return op(st[l][k], st[r - (1 << k) + 1][k]);
    }
};

應用

多次求區間詢問值(需滿足可重復貢獻和結合律,如最值,按位與值,按位或值,\(gcd\)值,代碼中默認為最大值)。

例題

Set To Max

總結

以上是生活随笔為你收集整理的ST表的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。