rmq(range mininum/maxnum query):即區間最值查詢。對於長度為\(n\)的陣列\(a\),有若干次詢問\(rmq(i,j)\),回答下標區間\([i,j]\)內的最大/最小值。
st表可以很好地解決此類問題,預處理複雜度\(o(nlogn)\),查詢\(o(1)\)。
設\(a[i]\)是要求區間最值的陣列,\(f[i][j]\)表示從第\(i\)個數起連續\(2^j\)個數中的最大值。
顯然初始化時要令\(f[i][0]=a[i]\)。
除初始狀態外,\(f[i][j]\)表示的區間必有偶數個數字。將其均分為兩段,一段為\(f[i][j-1]\),另一段為\(f[i+2^][j-1]\)。注意兩段均包含\(2^\)個數字。
則狀態轉移方程(以求區間最大值為例)
\[f[i][j]=max(f[i][j-1],f[i+2^][j-1])
\]從而預處理出陣列中所有長度為\(2^j\)
\((j=0,1...log_2n(向下取整))\)的區間上的最值。
//其實就是區間dp
for (int j = 1; j <= lg[n]; j++)
另外\(log_2i\)的值同樣可以預處理得出。(和倍增lca的lg預處理不一樣,不要混淆!這裡是真正的\(log_2i\),那邊是\(log_2i+1\))
lg[0] = -1;
for (int i = 1; i <= n; i++)
const int maxn = 1e5 + 100;
int a[maxn], f[maxn][22], lg[maxn];
int main()
for (int i = 1; i <= n; i++)
for (int j = 1; j <= lg[n]; j++)
}for (int i = 1; i <= m; i++)
return 0;
}
資料結構學習筆記 鍊錶
表示式的計算 表示式的計算涉及到棧的操作 對於表示式 a b c d e f 演算法 用到兩個棧,分別是符號棧和運算元棧。輸入表示式時,為了表示表示式輸入完畢,在表示式的最後加上 號,也就是說輸入的表示式為 a b c d e f 首先設定各個符號的優先順序,和 的優先順序為0,也就是最低的 和 的...
資料結構學習筆記 雜湊表
1.什麼是雜湊表 1 雜湊表是從乙個集合a到另乙個集合b的對映。2 集合a中的元素稱為鍵值,集合b中的元素稱為hash值。3 對映在數學上相當於乙個函式,集合a中的元素如何對映到集合b,hash函式決定。4 若兩個不同的鍵值對應同乙個hash值,這種情況為hash碰撞。2.雜湊與查詢 設集合a為查詢...
資料結構學習筆記 鍊錶
2.建立鍊錶 3.單向和雙向迴圈鍊錶 4.總結 struct list node 首先了解鍊錶的組成部分 說明 頭節點 在單鏈表的第乙個結點之前附設乙個結點,它沒有直接前驅,稱之為頭結點,頭結點的資料域可以不儲存任何資訊,指標域指向第乙個節點 首節點 的位址。頭結點的作用是使所有鍊錶 包括空表 的頭...