單調線性結構之 單調佇列

2021-08-22 13:07:40 字數 1091 閱讀 9689

簡介

乙個佇列內部的元素具有嚴格單調性的一種資料結構,分為單調遞增佇列和單調遞減佇列。

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 滑動視窗最大值 此題是單調佇列,每次遇到乙個元素,一直從隊尾彈出,直到隊尾元素大於該元素為止。還需...