POJ滑動視窗

2022-09-09 01:00:39 字數 1515 閱讀 7577

現在有一堆數字共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 3 -1 -3 5 3 6 7

輸出樣例#1:複製

-1 -3 -3 -3 3 3

3 3 5 5 6 7

50%的資料,n<=10^5

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 4

using

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 ...