現在有一堆數字共n個數字(n<=10^6),以及乙個大小為k的視窗。現在這個從左邊開始向右滑動,每次滑動乙個單位,求出每次滑動後視窗中的最大值和最小值。
例如:the array is [1 3 -1 -3 5 3 6 7], and k = 3.
輸入格式:
輸入一共有兩行,第一行為n,k。
第二行為n個數(
輸出格式:
輸出共兩行,第一行為每次視窗滑動的最小值
第二行為每次視窗滑動的最大值
輸入樣例#1:複製
8 3輸出樣例#1:複製1 3 -1 -3 5 3 6 7
-1 -3 -3 -3 3 350%的資料,n<=10^53 3 5 5 6 7
100%的資料,n<=10^6
【解題思路】
一道單調佇列的經典題了,今天來發一篇題解:
這裡有兩部分**相似,分別是求下降棧和上公升棧
首先要初始化head=1,tail=0表示當前隊列為空
以單調下降棧為例:
則我們可知當我們把區間(l,r)移動到(l+1,r+1)如果隊首元素不在(l+1,r+1)中,刪除它將a[r+1]插入佇列這樣處理後的隊首元素便是最大值
入棧(佇列)的時候要判斷棧頂是否與插入的元素符合大小關係,否則出棧頂直到滿足要求
這也單調佇列很重要的思想
其餘同理
【code】
1 #include 2 #include 3 #include 4using
namespace
std;
5const
int n=1000005;6
inti,n,k,a[n],q[n],num[n];
7int
head,tail;
8int
f1[n],f2[n];
9int
main()
24 head=1
;25 tail=0;26
for (register int i=1;i<=n;i++)
33for(register int i=k;i<=n;i++)
34 printf("
%d "
,f1[i]);
35 printf("\n"
);36
for(register int i=k;i<=n;i++)
37 printf("
%d "
,f2[i]);
38 printf("\n"
);39
return0;
40 }
POJ 滑動視窗 優先佇列的應用
資料結構與演算法a 第三章 棧與佇列 練習題 滑動視窗 對於最大最小值分別維護乙個優先佇列 儲存元素下標 以最小值為例。每次遇到乙個新元素,從隊尾插入。插入時刪去佇列中比該值大的元素。因為當前值出現的下標較晚,所以以後一定範圍視窗的最小值不會超過該值 隊首是當前視窗的最小值。同時要注意維護隊首的下標...
poj 2823 滑動視窗 單調佇列
poj2823 思路 最暴力的做法就是模擬過程,列舉每乙個長度為k的區間,然後遍歷一遍找最值,複雜度為n 2 這題n的範圍到了1e6 n 2 在規定時間內是跑不完的 所以這題要用資料結構優化 什麼樣的資料結構呢 對於當前區間為l到r 那麼往後移動了之後 區間變為了 l 1 到 r 1 也就是a l ...
Week5 D 滑動視窗滑動視窗
week5 d 滑動視窗滑動視窗 zjm 有乙個長度為 n 的數列和乙個大小為 k 的視窗,視窗可以在數列上來回移動.現在 zjm 想知道在視窗從左往右滑的時候,每次視窗內數的最大值和最小值分別是多少.例如 數列是 1 3 1 3 5 3 6 7 其中 k 等於 3.window position ...