C 單調佇列與單調棧 滑動視窗題解

2021-09-02 23:23:31 字數 1582 閱讀 4121

現在有一堆數字共n個數字(n<=10^6),以及乙個大小為k的視窗。現在這個從左邊開始向右滑動,每次滑動乙個單位,求出每次滑動後視窗中的最大值和最小值。

例如:the array is [1 3 -1 -3 5 3 6 7], and k = 3.

第1行:2個整數n,k(k<=n<=1000000) 第2行:n個整數,表示陣列的n個元素(<=2*10^9)

第1行:滑動視窗從左向右移動每個位置的最小值,每個數之間用乙個空格分開 第2行:滑動視窗從左向右移動每個位置的最大值,每個數之間用乙個空格分開

8 3

1 3 -1 -3 5 3 6 7

-1 -3 -3 -3 3 3

3 3 5 5 6 7

首先,我們眼裡只有乙個詞————暴搜,沒錯這就是我們的思路,但是此暴搜非彼暴搜,我們是要有技術含量的(不然你怎麼ac這道題呢)。

廢話少說,現在我們可以想象,我們可以用兩個單調佇列來儲存乙個不下降序列,乙個不上公升序列。而判斷這個單調佇列中的最大和最小值是否還在視窗中,只需要我們在單調佇列中儲存其的序號,再用乙個while迴圈將前頭指標增加,就可以將其踢出佇列。

#include#include#includeusing namespace std;

int m,n,a[1000005],a1[1000005],tail1=1,tail2=1,back1,back2,s1[1000005],s2[1000005];

struct nodes[1000005];

int read()//讀入優化

while(s>='0'&&s<='9')

return x*f;

}int main()

back1++;

a[back1]=i;

while(tail2<=back2&&back2>=0)

back2++;

a1[back2]=i;}}

s1[1]=s[a[tail1]].x;

s2[1]=s[a1[tail2]].x;

for(int i=m+1;i<=n;i++)

back1++;

a[back1]=i;

while(tail2<=back2&&back2>=0)

back2++;

a1[back2]=i;

while(a[tail1]

tail1++;

while(a1[tail2]

tail2++;

s1[i-m+1]=s[a[tail1]].x;

s2[i-m+1]=s[a1[tail2]].x;

}for(int i=1;i

printf("%d ",s2[i]);

printf("%d\n",s2[n-m+1]);

for(int i=1;i

printf("%d ",s1[i]);

printf("%d",s1[n-m+1]);

}

單調棧 最大矩形 單調佇列 滑動視窗

給乙個直方圖,求直方圖中的最大矩形的面積。例如,下面這個中直方圖的高度從左到右分別是2,1,4,5,1,3,3,他們的寬都是1,其中最大的矩形是陰影部分。輸入包含多組資料。每組資料用乙個整數n來表示直方圖中小矩形的個數,你可以假定1 n 100000.然後接下來n個整數h1,hn,滿足 0 hi 1...

單調佇列 滑動視窗 模板 單調佇列

有乙個長為 n 的序列 a,以及乙個大小為 k 的視窗。現在這個從左邊開始向右滑動,每次滑動乙個單位,求出每次滑動後視窗中的最大值和最小值。the array is 1,3,1,3,5,3,6,7 and k 3。輸入一共有兩行,第一行有兩個正整數 n,k。第二行 n 個整數,表示序列 a 輸出共兩...

單調佇列 滑動視窗

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