單調佇列總結

2021-08-21 23:36:58 字數 677 閱讀 3267

原博主部落格

維護單調佇列: 

a)從隊頭到隊尾,元素在我們所關注的指標下是遞減的(嚴格遞減,而不是非遞增),比如查詢如果每次問的是視窗內的最小值,那麼佇列中元素從左至右就應該遞增,如果每次問的是視窗內的最大值,則應該遞減,依此類推。這是為了保證每次查詢只需要取隊頭元素。

b)從隊頭到隊尾,元素對應的時刻(此題中是該元素在數列a中的下標)是遞增的,但不要求連續,這是為了保證最左面的元素總是最先過期,且每當有新元素來臨的時候一定是插入隊尾。

滿足以上兩點的佇列就是單調佇列,首先,只有第乙個元素的序列一定是單調佇列。

那麼怎麼維護這個單調佇列呢?無非是處理插入和查詢兩個操作。

對於插入,由於性質b,因此來的新元素插入到佇列的最後就能維持b)繼續成立。但是為了維護a)的成立,即元素在我們關注的指標下遞減,從隊尾插入新元素的時候可能要刪除隊尾的一些元素,具體說來就是,找到第乙個大於(在所關注指標下)新元素的元素,刪除其後所有元素,並將新元素插於其後。因為所有被刪除的元素都比新元素要小,而且比新元素要舊,因此在以後的任何查詢中都不可能成為答案,所以可以放心刪除。

對於查詢,由於性質b,因此所有該時刻過期的元素一定都集中在隊頭,因此利用查詢的時機刪除隊頭所有過期的元素,在不含過期元素後,隊頭得元素就是查詢的答案(性質a),將其返回即可。

由於每個元素都進隊出隊一次,因此攤銷複雜度為o(n)

單調佇列與單調棧總結

ref 單調棧解決的是以某個值為最小 最大 值的最大區間,實現方法是 求最小值 最大值 的最大區間,維護乙個遞增 遞減 的棧,當遇到乙個比棧頂小的值的時候開始彈棧,彈棧停止的位置到這個值的區間即為此值左邊的最大區間 同時,當乙個值被彈掉的時候也就意味著比它更小 更大 的值來了,也可以計算被彈掉的值得...

單調佇列專題總結

1 hdu 4193 題意 n個數組成的序列環,求長度小於等於m的字串的最大區間和。思路 如果n個數為線性關係,可以用單調佇列維護第i個數之前的m個數,及時剔除沒用的數。o n 解決。這裡是環,2倍陣列破環成鏈即可。非自己寫 include include includeusing namespac...

單調棧 佇列總結

51nod 1102 面積最大的矩形 有乙個正整數的陣列,化為直方圖,求此直方圖包含的最大矩形面積。法一 以每個柱子為高,預處理出每個點能夠向兩邊延伸的距離,左找到第乙個比當前點高度小的下標記為i,向右找到第乙個比當前點高度小的下標記為j,那麼此時以這點高度的最大值是f i j i 1 然後用for...