單調佇列(用點心,很簡單)

2021-09-08 19:40:58 字數 693 閱讀 2663

先說點題外話,為什麼要講單調佇列呢?因為我恨透了它的題解。前段時間,我一聽到「單調佇列」,我就心想:完了,是單調佇列。因為我認為很難,好好看看,原來是題解講得太複雜了,這十分簡單,易理解,易實現。

何為單調佇列,就是乙個由大到小或由小到大排列的佇列,如圖:

到這裡,大家一定都理解,但,這有什麼用呢。

那麼我們這就以求最大值為例:

設佇列num

numnu

m(儲存位置),列舉i。

這個佇列這樣做:

把佇列中位置已超範圍(不在框中)的數從頭到尾刪掉

把a [i

]a[i]

a[i]

從隊尾往前刪(迴圈列舉i),只要隊尾的值小於a[i

]a[i]

a[i]

就退隊(whi

lewhile

whil

e語句),直到不小於。

在隊尾插入a[i

]a[i]

a[i]

o k!

ok!ok

!

for

(i=1

;i<=n;i++

)//列舉a[i]

單調棧與單調佇列簡單例題

poj3250 題意 有n只奶牛排成一列向右看,每頭奶牛只能看到比自己矮的奶牛,即會被高的奶牛擋住後面,問共有多少只奶牛能被看到 思路 考慮每頭奶牛能被前面牛看到的次數,也就是從他左邊開始單調遞減的序列的長度,用單調棧維護即可 include includeusing namespace std c...

用雙端佇列實現單調佇列

單調佇列是指 佇列中元素之間的關係具有單調性,而且,隊首和隊尾都可以進行出隊操作,只有隊尾可以進行入隊操作。以單調不減隊列為例 佇列內的元素 e1,e2,e3.en 存在 e1 e2 e3 en 的關係,所以隊首元素e1一定是最小的元素。與優先佇列不同的是,當有乙個新的元素e入隊時,先要將隊尾的所有...

用單調佇列處理多重揹包

有n種物品,每種物品的數量為c1,c2 cn。從中任選若干件放在容量為w的揹包裡,每種物品的體積為w1,w2 wn wi為整數 與之相對應的價值為p1,p2 pn pi為整數 求揹包能夠容納的最大價值。input 第1行,2個整數,n和w中間用空格隔開。n為物品的種類,w為揹包的容量。1 n 100...