acwing的第157題----滑動視窗
之所以接觸到這個單調佇列,是在接觸多重揹包究極版的時候看到的,那道題給的資料從容量從v=1000變成了v=10000,給的物品資料也相應從2000變成了20000,多了10倍,如果只進行二進位制優化而不進行單調佇列優化的話就會tle
這時不得不刷一下單調佇列的經典入門題----滑動視窗
其實老早在oi就見過這道題,不過當時是寒假,就沒心思去弄懂它
(其實根本原因是檔次不夠hhh
現在看看這道題目,其實就是很簡單地在乙個長度給定的視窗裡面不斷地判斷你的下乙個元素要不要放進去
放進去的話,單調佇列陣列存入這個新元素,同時記錄下標
接著就是邊框的移動和元素的輸出這兩個微操作了
廢話不多說!!!上**
//我一共敲了兩遍,全是乾貨,很硬核
//第二篇也許更詳細一點
//總之先把模板背下來吧,不太理解的話先繼續往前走,
//等哪天突然通了的話再回過頭來複習就好了
#includeusing namespace std;
const int n=1000001;
int n,k;
int q[n];//佇列
int p[n];//記錄下標的陣列
int a[n];
int main()
puts("");
//第二步輸出滑動視窗的最大值
head=1,tail=0;
for(int i=1;i<=n;i++)
}
#include#include#includeusing namespace std;
const int n=1000010;
int q[n];//這個陣列就是記錄以k為大小的框(單調佇列)
int p[n];//這個陣列用來記錄陣列下標
int a[n];//儲存要處理的元素
int n,k,head,tail;//n是個數,k是框的大小,head是頭節點,tail是尾節點
int main()
puts("");
//現在處理max單調佇列,反過來就好了
head=1,tail=0;
for(int i=1;i<=n;i++)
}
這還有個在acwing裡寫的版本(其實一毛一樣hhh),有興趣可以去看看
我的**注釋很詳細,其實這也就是板子題啦,熟練了才能靈活的運用到複雜的題目中進行優化,每天想心上人的時候爬起來多敲幾遍就好啦
單調佇列 滑動視窗
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 肯定會超時,因此就想到把每次的最大值和...