滑動視窗
單調佇列經典題,話說我第一次做這個題的時候是用線段樹水的
兩個單調佇列分別維護最小最大值,因為視窗有k的長度限制所以維護下標更方便
又由於是從左往右掃過去的,所以可以保證下標和值都是單調的
讀乙個維護乙個,以單增佇列為例,每讀入乙個元素就把前面比它大的都彈出,然後將元素入隊
因為視窗有k長,所以i>=k的時候再開始記錄答案,將已經在視窗外的元素(即i-元素下標》=k)從隊頭彈出佇列(這時候就體現出維護下標的作用了,維護元素的話就要再開乙個陣列記下標),做完之後隊頭元素就是最小值,記錄在ans1中
單減佇列同理
最後輸出兩個陣列就好了
#include#define maxn (1000000+5)
using namespace std;
inline int read()
while(isdigit(c))
return cnt*f;
}int q1[maxn],q2[maxn];//q1->max,q2->min
int n,k,a[maxn];
int l1,l2,r1,r2;
int ans_min[maxn],ans_max[maxn];
int main()
} for(register int i=1;i<=n-k+1;i++)printf("%d ",ans_min[i]);
printf("\n");
for(register int i=1;i<=n-k+1;i++)printf("%d ",ans_max[i]);
return 0;
}
洛谷 P1886 滑動視窗
洛谷 p1886 滑動視窗 單調佇列 單調遞增佇列 使得每個入隊元素都小於已有元素 保持遞增 遇到隊尾元素小於未入隊元素時,彈出隊尾再使未入隊元素入隊 資料結構 deque,因為滑動視窗需要判斷佇列元素是否過時,而deque可以通過pop front 彈出隊首元素 每次滑動都記錄隊首元素即可。inc...
洛谷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...