一道經典題目(講到單調佇列必定會講的乙個題目)
滑動視窗
講單調佇列前先來乙個需要用到的資料結構:雙端佇列/deque(也可以用陣列進行模擬),我們需要用到的函式有這些(因為我只學我要用到的0.0)
建立
deque<
int>que
隊列為空
que.
empty()
佇列清零
que.
clear()
隊尾元素
que.
back()
隊首元素
que.
front()
刪除隊尾元素
que.
pop_back()
刪除隊首元素
que.
pop_front()
在隊尾插入元素x
我們的原則是答案就是隊首元素,即維護隊首我們先找最小值minimum
模擬過程:
我們需要找最小值,就構建乙個單調遞增的佇列,因為隊首是我們維護的答案,我們每放乙個數進入佇列時,要保證放進去後佇列仍然單調,即把影響它不單調的元素踢出佇列。
第乙個數:隊列為空,需要放入1,直接放入佇列,佇列:
第二個數:隊尾為1,需要放入3(大於1)可以直接放入,佇列:
第三個數:隊尾為3,需要放入-1(大於1、3),踢出1、3,放入-1,佇列:
第四個數:隊尾為-1,需要放入-3,踢出-1,放入-3,佇列:
…找最大值就要構建乙個單調遞減的佇列
#include
using
namespace std;
int num[
1000005];
intmain()
int now=1;
//找最小值
while
(now<=n)
while
(!que.
empty()
)//保證隊首合法
que.
push_back()
;if(now==k)
cout << que.
front()
.second;
if(now>k)
cout <<
" "<< que.
front()
.second;
now++;}
cout << endl ;
que.
clear()
; now=1;
//找最大值
while
(now<=n)
while
(!que.
empty()
) que.
push_back()
;if(now==k)
cout << que.
front()
.second;
if(now>k)
cout <<
" "<< que.
front()
.second;
now++;}
return0;
}
對於乙個單調佇列,需要有以下步驟
確定單調型別–>構建合適的雙端佇列–>保證插入後單調–>保證隊首的合法性–>完成
用雙端佇列實現單調佇列
單調佇列是指 佇列中元素之間的關係具有單調性,而且,隊首和隊尾都可以進行出隊操作,只有隊尾可以進行入隊操作。以單調不減隊列為例 佇列內的元素 e1,e2,e3.en 存在 e1 e2 e3 en 的關係,所以隊首元素e1一定是最小的元素。與優先佇列不同的是,當有乙個新的元素e入隊時,先要將隊尾的所有...
演算法整理 複習 佇列 單調佇列 雙端佇列
這裡說一下,佇列中全部是元素從隊尾進 rear 隊頭出 head 左開右閉區間,即 rear 所指的位置是包含在佇列中的,head 所指的位置不在佇列中,所以 rear head 時隊列為空。我也分不太清應該是從隊尾進還是隊頭進比較合適,但是也不是什麼大問題,畢竟只是個變數名的問題,封裝好後並不會有...
HDU 6319 單調佇列 雙端佇列
原題 題意 乙個數列,1e7數量。對每個區間 i,i m 1 都有操作。操作要查詢該區間的最大值和該區間的最長的嚴格上公升的序列的長度。正這不好計算,倒著來比較好。用雙端的單調佇列維護資訊。倒著來的話,就把要加進來的數和隊尾比較,大於等於隊尾的話,說明隊尾那個數沒用了。隊頭就是區間的最大值,佇列長度...