牛客網 滑動視窗 單調佇列

2022-01-12 16:28:01 字數 1186 閱讀 7782

給乙個長度為n(<=1e6)的陣列,乙個長為k的滑動窗體從最左端移至最右端,你只能看到視窗中的k個數,每次窗體向右移動一位,如下圖:

你的任務是找出窗體在各個位置時的最大值和最小值。

第1行:兩個整數n和k;

第2行:n個整數,表示陣列的n個元素(≤2e9);

第一行為滑動視窗從左向右移動到每個位置時的最小值,每個數之間用乙個空格分開;

第二行為滑動視窗從左向右移動到每個位置時的最大值,每個數之間用乙個空格分開。

示例1

8 3

1 3 -1 -3 5 3 6 7

-1 -3 -3 -3 3 3

3 3 5 5 6 7

思路:區間性問題,首先要有乙個l和r指示區間左右兩邊。

開乙個dq陣列,存元素的下標,再通過引用原陣列獲得值去比較,存下標的好處是可以指示出區間長度。

舉例取區間最小值的,每遍歷乙個a[i],把佇列中比它小的弄掉,讓當前這個更小的當頭,形成單調佇列,l始終指示區間範圍最小的,隊頭用r指示。詳看**。

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define inf 0x3f3f3f3f //

/填充無限小-0x7f

intn,k;

int a[1000086

];int dq[1000086];///

用來儲存a[i]的下標,陣列a通過下標獲取值,區間範圍[ i-k,i ], i-k

<=l<=r<=i

intmain()

printf("\n

");l=r=0

; dq[r++]=1

;

for(int i=2;i<=n;i++)

printf("\n

");return0;

}

單調佇列 滑動視窗

nkoj 2152 description 給你乙個長度為n n 10 6 的陣列,乙個長為k的滑動的窗體從最左移至最右端,你只能見到視窗的k個數,每次窗體向右移動一位,找出窗體所包含的數字的最大和最小值,如下表所示 k的值為3 視窗位置 最小值 最大值 1 3 1 3 5 3 6 7 1 3 1 ...

滑動視窗 單調佇列

給定乙個大小為n 106的陣列。有乙個大小為k的滑動視窗,它從陣列的最左邊移動到最右邊。您只能在視窗中看到k個數字。每次滑動視窗向右移動乙個位置。以下是乙個例子 該陣列為 1 3 1 3 5 3 6 7 k為3。視窗位置 最小值 最大值 1 3 1 3 5 3 6 7 1 3 1 3 1 3 5 3...

單調佇列 滑動視窗

p1886 滑動視窗 模板 單調佇列 有乙個長為 n 的序列 a,以及乙個大小為 k 的視窗。現在這個從左邊開始向右滑動,每次滑動乙個單位,求出每次滑動後視窗中的最大值和最小值。如果按照暴力方法做的話,每一次判斷相鄰的k個數的最大值和最小值,複雜度為o n k 肯定會超時,因此就想到把每次的最大值和...