單調佇列 洛谷p1886)模板題

2021-10-19 09:58:20 字數 1214 閱讀 4652

有乙個長為 n的序列 a,以及乙個大小為 k的視窗。現在這個從左邊開始向右滑動,每次滑動乙個單位,求出每次滑動後視窗中的最大值和最小值。

例如:the array is [1,3,-1,-3,5,3,6,7], and k = 3。

1.佇列中的元素其對應在原來的列表中的順序必須是單調遞增的。

2.佇列中元素的大小必須是單調遞*(增/減/甚至是自定義也可以)

單調佇列與普通佇列不一樣的地方就在於單調佇列既可以從隊首出隊,也可以從隊尾出隊。

以最小值為例:構造乙個單調佇列q[i],記h為元素下標,q中存下標。第一次:q=;第二次:q=(因為3>1且在範圍內);第三次:q=(因為佇列單調遞增,-1最小,所以擠掉1和3,找最小值的時候也不會輪到它們);第四次:q=(1已經在外面了。-3-3 可以作為候選人);第六次:q=(果斷擠掉,有比5合適的候選人);第七次:b=(4不在範圍內,出列);第八次:b=

每次都輸出佇列中的第乙個元素**(因為每次只有滿足待入隊的元素比佇列中隊尾元素更大才可以入隊,否則需要將比它小的所有佇列中的元素全部出隊,再將它入隊,因此佇列始終單調遞增,不可能存在比第乙個元素更小的元素)**。

以此維護佇列中元素序號的單調性,得到結果。

只是比較判斷,時間複雜度很小。

相等的值也要擠掉。

最大值同理。

上**:

#include

#include

#include

#include

#include

#include

using

namespace std;

int n,k;

int q1[

1000001

],q2[

1000001];

int a[

1000001];

intmin_deque()

//求視窗內最小值

cout<

//不要忘記換行

}int

max_deque()

//求視窗內的最大值,步驟類似最小值

}int

main()

//自認為碼風還是比較簡潔的(#^.^#)

洛谷P1886 滑動視窗 模板 單調佇列

傳送門 難度普及 提高 如題,單調佇列板子題。單調佇列是乙個雙端佇列,頭和尾都可以出元素。本文對單調佇列的實現進行簡述 模擬,方便理解,然後給出完整ac 因為求最大值與求最小值的思路是基本相同的,所以以求最小值為例進行分析,即對void minqueue 進行分析。int h 0,t 1 隊首h,隊...

單調佇列 洛谷P1886 滑動視窗

題目鏈結 dalao題解 題目給乙個長度為n的序列,然後給乙個值k,要求出長度為k的視窗在數列滑動過程中的最大值和最小值 圖示如下 比如給乙個長度為n 8的序列為 1 3 1 3 5 3 6 7 視窗長度是k 3 那麼視窗滑動中的 最小值就是 1 3 3 3 3 3 最大值就是 3 3 5 5 6 ...

洛谷 P1886 滑動視窗 單調佇列

現在有一堆數字共n個數字 n 10 6 以及乙個大小為k的視窗。現在這個從左邊開始向右滑動,每次滑動乙個單位,求出每次滑動後視窗中的最大值和最小值。例如 the array is 1 3 1 3 5 3 6 7 and k 3.輸入格式 輸入一共有兩行,第一行為n,k。第二行為n個數 輸出格式 輸出...