洛谷 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個數 輸出格式 輸出...