單調佇列 洛谷P1886 滑動視窗

2021-08-22 13:49:12 字數 1214 閱讀 2025

題目鏈結

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 7

這題大概是乙個單調佇列的模板題…

單調佇列就是乙個從隊首到隊尾滿足單調性的佇列,比如單調遞增或者單調遞減,如果要加入乙個新的元素,就加入隊尾,如果加入的元素破壞了單調佇列的單調性,就執行pop_back操作,直到滿足單調性位置;

這題我們需要維護兩個單調佇列,乙個是最大值佇列,乙個是最小值佇列;以維護最大值隊列為例;

在每次滑動前,從隊首開始遍歷整個序列,如果有某個元素已經不在視窗內了(過時了)就執行pop_front;

然後再從隊尾開始遍歷整個序列,如果隊尾的元素比即將新加進來的元素還小,那麼這個隊尾元素就始終不可能成為以後視窗中的最大值了(因為他會比新加入的元素更早的過時),所以可以執行pop_back;

如是,我們的隊首元素就始終是當前視窗中的最大值了;

具體實現我是用的dequeue,因為涉及到pop_front和pop_back操作,用dequeue比較方便;

整體**如下:

#include 

#include

#include

#include

using

namespace

std;

const

int maxx=1e6+6;

int n,k;

int a[maxx];

deque

p,q;

int main()

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

cerr

return

0;}

錯點:

1.i>=k的時候就可以直接輸出值了,不用新開陣列來存答案;

2.洛谷oj貌似對輸出的答案的空格不敏感,所以直接放心的在答案後面輸出空格就好;

3.這題好像用cin cout會掛… 老老實實用標準讀寫了

洛谷 P1886 滑動視窗 單調佇列

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

洛谷P1886 滑動視窗 單調佇列

沒想到啊沒想到,時隔兩個月,我單調佇列又懵了 調了乙個小時,最後錯在快讀,啊!不過洛谷討論真好啊,感謝大佬!考前就不推新東西了,好好寫寫那些學過的東西 題目點這裡 我就不粘了自己點一下看吧 這題還有其他奇奇怪怪的做法,比如你可以當做rmq,用線段樹啊st表啊隨便你,不過單調佇列就可以了 單調佇列說到...

洛谷P1886 滑動視窗 單調佇列

給出n m role presentation n,m n,m和乙個含有 n role presentation n n個元素的數列,求每個連續的長度為 m role presentation m m的子串的最小值和最大值。暴力o n2 role presentation o n 2 o n2 可以...