先說點題外話,為什麼要講單調佇列呢?因為我恨透了它的題解。前段時間,我一聽到「單調佇列」,我就心想:完了,是單調佇列。因為我認為很難,好好看看,原來是題解講得太複雜了,這十分簡單,易理解,易實現。
何為單調佇列,就是乙個由大到小或由小到大排列的佇列,如圖:
到這裡,大家一定都理解,但,這有什麼用呢。
那麼我們這就以求最大值為例:
設佇列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...