UOJ 47 滑行的視窗

2022-05-26 08:48:08 字數 1468 閱讀 5571

給定乙個長度為n的數列a,再給定乙個長度為k的滑動視窗,從第乙個數字開始依次框定k個數字,求每次框定的數字中的最大值和最小值,依次輸出所有的這些值。下面有乙個例子陣列是 [1 3 1 3 5 6 7] , k 是3:

視窗位置              視窗中的最小值   視窗中的最大值

[1 3 -1] -3 5 3 6 7 -1 3

1 [3 -1 -3] 5 3 6 7 -3 3

1 3 [-1 -3 5] 3 6 7 -3 5

1 3 -1 [-3 5 3] 6 7 -3 5

1 3 -1 -3 [5 3 6] 7 3 6

1 3 -1 -3 5 [3 6 7] 3 7

第一行包含兩個整數 n 和 k ,分別表示陣列的長度和滑動視窗長度。

第二行n個整數,表示數列元素的值。

第一行從左到右視窗看到的最小值。

第二行從左到右視窗看到的最大值。

8 3

1 3 -1 -3 5 3 6 7

-1 -3 -3 -3 3 3

3 3 5 5 6 7

30%:n<=100 k<=20

60%:n<=5000 k<=20

100%:n<=10^6,每個元素不操過int型別

需要讀入輸出優化

題解:單調佇列%%%

#include #include 

#include

#include

using

namespace

std;

deque

q; deque

q2;int a[1000005],mmin[1000005],mmax[1000005

];int

n,k;

void putmax(int

x)

while(!q.empty()&&x-q.front()>=k)

q.push_back(x);

}void putmin(int

x)

while(!q2.empty()&&x-q2.front()>=k)

q2.push_back(x);

}int

main ( )

} for(int i=1;i<=num;i++)

printf("\n

");for(int i=1;i<=num;i++)

printf("\n

");

return0;

}

47 滑行的視窗

給定乙個長度為n的數列a,再給定乙個長度為k的滑動視窗,從第乙個數字開始依次框定k個數字,求每次框定的數字中的最大值和最小值,依次輸出所有的這些值。第一行包含兩個整數 n 和 k 分別表示陣列的長度和滑動視窗長度。第二行n個整數,表示數列元素的值。第一行從左到右視窗看到的最小值。第二行從左到右視窗看...