洛谷 P1886 滑動視窗

2021-09-25 02:36:02 字數 1310 閱讀 5213

洛谷 p1886 滑動視窗

單調佇列:

單調遞增佇列:使得每個入隊元素都小於已有元素

保持遞增:遇到隊尾元素小於未入隊元素時,彈出隊尾再使未入隊元素入隊

資料結構:deque,因為滑動視窗需要判斷佇列元素是否過時,而deque可以通過pop_front()彈出隊首元素

每次滑動都記錄隊首元素即可。

#include

using

namespace std;

const

int n=

1e6;

int arr[n]

;int amax[n]

;int amin[n]

;int k;

int n;

intmain()

deque<

int> qmax;

deque<

int> qmin;

for(

int i=

0;i1;i++

) qmax.

push_back

(i);

while

(!qmin.

empty()

&& arr[qmin.

back()

]> arr[i]

) qmin.

push_back

(i);

}for

(int i=k-

1;i)while

(!qmax.

empty()

&&arr[qmax.

back()

]) qmax.

push_back

(i);

amax[i]

=arr[qmax.

front()

];while

(!qmin.

empty()

&&i-qmin.

front()

>=k)

while

(!qmin.

empty()

&&arr[qmin.

back()

]>arr[i]

) qmin.

push_back

(i);

amin[i]

=arr[qmin.

front()

];}for

(int i=k-

1;i) cout

int i=k-

1;i) cout

}

洛谷p1886 滑動視窗

滑動視窗 單調佇列經典題,話說我第一次做這個題的時候是用線段樹水的 兩個單調佇列分別維護最小最大值,因為視窗有k的長度限制所以維護下標更方便 又由於是從左往右掃過去的,所以可以保證下標和值都是單調的 讀乙個維護乙個,以單增佇列為例,每讀入乙個元素就把前面比它大的都彈出,然後將元素入隊 因為視窗有k長...

洛谷P1886 滑動視窗

題目描述輸入格式 輸入一共有兩行,第一行為n,k。第二行為n個數 輸出格式 輸出共兩行,第一行為每次視窗滑動的最小值 第二行為每次視窗滑動的最大值 輸入輸出樣例 輸入 1 8 31 3 1 3 5 3 6 7 輸出 1 1 3 3 3 3 3 3 3 5 5 6 7 說明 提示 50 的資料,n 1...

洛谷 P1886 滑動視窗

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