題目鏈結
思路:在區間滑動的時候,每次會有乙個新的數進來和乙個舊的數出去。需要用乙個合適的資料結構來更新這樣的狀態。
如果出去的數是當前的最大值或者最小值,要可以很快找到下乙個代替的數;
如果進來的數可以成為新的最大的數或者最小的數,或者都不是那又該怎樣儲存這個數?
單調佇列,它來了;
就從找區間最小值來說:乙個新的數加入的時候,從佇列的尾部開始比較,如果新加入的數 ≤ 尾部的數, 尾部.pop() ,一直到新加入的數 > 尾部的數or 佇列裡沒乙個能打的-> 新加入的數成為頭部,這樣就可以保證每次進來的數經過更新後這個佇列裡面頭部永遠都是最小的;
當然在上面的操作之前需要先判斷一下 頭部的那些節點是不是過期了,有些數經過區間滑動並不在區間裡面了,所以迴圈判斷一下,過期了 pop() 掉就好了,所以這麼一搞佇列就空掉了也不是沒有可能。
最大最小分開搞,o(n) 就可以a 遼 skr~
#include
using
namespace std;
int n, k, a[
1000006];
struct node deq[
1000006];
intmain()
int head =
1, tail =0;
node t;
for(
int i =
1;i <= n; i++
)puts(""
);head =
1, tail =0;
for(
int i =
1;i <= n; i++
)puts(""
);}
單調佇列 滑動視窗
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 肯定會超時,因此就想到把每次的最大值和...