1. 程式人生 > 實用技巧 >SF&SJJG-ST表

SF&SJJG-ST表

@

目錄

寫在前面

有錯誤請指出

正文

內容

ST表 是一個維護區間 最大值 或 最小值 的資料結構

ST表 用 \(O(n \log n)\) 的時間預處理,\(O(1)\) 的時間查詢

\(f[i][j]\) 表示為 下標 \(i\) 起,\(2^j\) 個數中的最大值,用倍增實現

很好理解

實現

本部落格以最大值為例

初始化

設維護的陣列為 \(a[i]\)
\(f[i][0] = a[i]\)

過程

是一個類似於 區間dp 的流程

很容易得出

\(f[i][1] = max (f[i][0] ,f[i + 1][0])\)

以此類推

\(f[i][j] = max (f[i][j - 1],f[i + 2^{j - 1}][j - 1])\)

就求出 ST表 了

void ST () {
 for (int len = 1;(1 << len) <= n;++ len) {
  for (int q = 1;q + (1 << len) <= n;++ q) {
   f[q][len] = max (f[q][len - 1] ,f[q + (1 << (len - 1))][len - 1]);
  }
 }
 return ;
}

查詢

有了 ST表 還不行,還得會查詢

很容易理解

ll RMQ (int l ,int r) {
 int k = (int) (log ((double) (r - l + 1)) / log (2.0));
    return max (f[l][k] ,f[r - (1 << k) + 1][k]);
}

此處為查詢 最大值

最小值同理,把 \(\max\) 改為 \(\min\) 即可

後記

謝謝大家

——2020.10.4
——2020.11.1照搬CSDN