log 1886 滑動視窗(單調佇列模版)

2022-05-16 11:31:22 字數 822 閱讀 8549

coding使我忘記化學

傳送門

如題,實質上是在考察單調佇列,最大值和最小值可分別用乙個單調佇列排序輸出。

操作方便,定義兩個陣列分別儲存佇列和每個元素的序號

由題得佇列原則:佇列陣列中末尾元素的序號與開頭元素序號之差不能大於k,使佇列的範圍保持為視窗的寬度

在保證這點之後,只要同時保證佇列始終是單調排序,這樣當元素序號》=視窗寬度(保證視窗圈滿元素)時,只要迴圈輸出開頭元素就可以了。

那麼如何保證佇列單調?拿最大值舉例:在向佇列中新增元素的過程中,如果乙個佇列中元素x後的元素y數值更大,那麼x將失去成為最大值的可能性,故需被移出佇列。

以上即為本題佇列操作方法,最小值同理。

完整**如下:

#include#include

using

namespace

std;

const

int maxn=1000001

;int item[maxn],line[maxn],element[maxn];//

item存放序號,line為單調數列

intmain()

cout

<<"\n"

; first=1

; last=0;//

兩個單調佇列間過渡的細節不能忘記

for(int i=1;i<=n;++i)//

排序輸出最大值

return0;

}

洛谷 1886 滑動視窗 單調佇列

單調佇列,就是字面意思。如何維護?假設我們是單調減的佇列 維護時,保證所有元素最多進隊一次出隊一次,複雜度o n 我們在隊頭放最大的元素,向右依次遞減。在隊尾插入新元素時,檢查新元素是否比隊尾元素大 是,則刪除隊尾元素,直到 比隊尾元素小時,插入新元素在隊尾。同時還要檢查一下,是否還在視窗範圍內 i...

P1886 滑動視窗 單調佇列

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

單調佇列 P1886 滑動視窗

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