簡介
乙個佇列內部的元素具有嚴格單調性的一種資料結構,分為單調遞增佇列和單調遞減佇列。
1、維護區間最值;
2、去除冗雜狀態;
3、保持佇列單調(最大值是單調遞減序列,最小值是單調遞增序列);
4、最優選擇在隊首。
思想裸題
求所有長度為k的區間內的最大值
這種題的**就是單調佇列的模板了
維護隊首(對於上題就是如果你已經是當前的k個之前那你就可以被刪了) ;
在隊尾插入(每插入乙個就要從隊尾開始往前去除冗雜狀態) ;
取出需要的最優解(佇列頭的值即是);
借助最優解,得到目前所求的最優解。
簡單舉例應用
數列為:6 4 10 10 8 6 4 2 12 14
n=10,k=3;
那麼我們構造乙個長度為3的單調遞減佇列:
首先,那6和它的位置0放入佇列中,我們用(6,0)表示,每一步插入元素時佇列中的元素如下
插入6:(6,0);
插入4:(6,0),(4,1);
插入10:(10,2);
插入第二個10,保留後面那個:(10,3);
插入8:(10,3),(8,4);
插入6:(10,3),(8,4),(6,5);
插入4,之前的10已經超出範圍所以排掉:(8,4),(6,5),(4,6);
插入2,同理:(6,5),(4,6),(2,7);
插入12:(12,8);
插入14:(14,9);
那麼f(i)就是第i步時佇列當中的首元素:6,6,10,10,10,10,8,6,12,14
#include
using namespace std;
int a[
200000];
struct node
node
(int xx,
int pp)
}list[
200000];
intmain()
return0;
}
例題
bzoj 1047
洛谷 3088
資料結構 單調棧,單調佇列
乙個單調遞增棧的例子 進棧元素分別為3,4,2,6,4,5,2,3 第i步操作結果1 3進棧3 23出棧,4進棧43 2進棧4 2 42 4出棧,6進棧65 4進棧6 4 64出棧,5進棧 6 57 2進棧6 5 2 82出棧,3進棧 6 5 3 對於乙個元素i 在 尾部 新增元素 while r ...
單調棧,單調佇列
大多數借鑑了 單調佇列是什麼呢?可以直接從問題開始來展開。poj 2823 給定乙個數列,從左至右輸出每個長度為m的數列段內的最小數和最大數。數列長度 n 106,m n 我們知道,解法 在暴力列舉的過程中,有乙個地方是重複比較了,就是在找當前的f i 的時候,i的前面其它m 1個數在算f i 1 ...
單調棧 單調佇列
單調棧 單調佇列是在棧和佇列的基礎上加上單調結構的資料結構。如果乙個元素入棧或入隊,他會檢查之前的元素,如果之前的元素不可能是答案的解,那麼就彈出元素,使得當前元素入棧或入隊。leetcode 239 滑動視窗最大值 此題是單調佇列,每次遇到乙個元素,一直從隊尾彈出,直到隊尾元素大於該元素為止。還需...