題目鏈結
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 可以...