單調佇列學習

2021-05-27 07:43:59 字數 918 閱讀 4195

【單調佇列】在解乙個序列某個區間段的最值問題,我們可以用到單調佇列來解決。 

比如poj2823 sliding window 就是乙個很好的例子:給定乙個序列,要求序列中固定長度為k 的區間中的最大值和最小值。 

【原理】單調佇列維護的是區間最值: 

1、最大值的維護: 

比如我們要維護乙個區間為k的最大值的單調佇列,由於新插入 的節點他的「生命力」肯定比原先已經在佇列中的元素「活」的時間長,將插入元素不斷與隊尾元素比, 如果他大於隊尾元素,那麼r--將隊尾元素刪掉,

(因為目前插入的這個元素值(設為pos)更大,而且「活」的時間 長,有pos在,隊尾元素的有「生」之年永遠都沒法為最大值,故而直接無視比pos小的隊尾了)

。直到對空位置或者 

找到了乙個比pos大的隊尾。 

2、k區間的維護: 

比如當前k區間的起點為i,即區間為[i,i+k-

1],那麼如果隊頭元素front的下標j在當前k區間範圍內,那麼他的值便不屬於當前k區間的最值,所以f++將對頭出隊。這段操作絕對不會遇到隊 

空的情況,應為第1步已經插入了乙個在區間為[i,i+k-

1]的元素pos,他下標j必然符合j>=i 

【模板**】 

struct

nodes  

; nodes qu1[n]; 

intr1,f1 ; 

遞減佇列:

void

insert(

intm,

intid,

intl)

//l為區間的最左下標,m要插入的值,id該值的下標 

//f>r qu empty 

init: f=r=0; 

insert(a[i],i,l); 

遞增的做相應的修改即可

總結:單調佇列使用多變,在具體的題目中,應靈活運用~

單調佇列學習筆記

單調佇列學習筆記 by menci 輔助佇列 m 即為單調佇列 luogu p3957 跳房子 noip2017普及組 跳房子 顯然答案有單調性,所以二分答案。判斷時 dp。f i 表示跳前i個格仔,且停在第 i 個格仔最大分數 sc ore i 表示第 i 個格仔的分數。易得轉移方程 f i m ...

單調佇列 學習筆記

q 給定乙個長度為n的序列 可能有負數 從中找出一段長度不超過m的連續子串行,使得其和最大 n 500000 n 500000 n 5000 00 a 對於這題 首先不難想到先求出數列字首和sum 那麼顯然問題的答案就是max i mn sum i minj i m i 1 sum j max n ...

單調佇列 學習筆記

單調佇列是一種特殊的雙端佇列,其滿足單調性,即內部元素單調遞增或單調遞減。單調佇列可以用陣列模擬,也可以用 stl 中的 deque 實現。例題 最大子序和 給定乙個長度為 n 的整數序列,從中找出一段長度不超過 m 的連續子串行,使得子串行中所有數的和最大。n,m leq 3 10 5 區間和可以...