题意
求长度为的窗口的最大值和最小值。
分析
单调队列入门题,也是很好的入门题。
用单调队列来解决问题,一般都是需要得到当前的某个范围内的最小值或最大值。
假设我们要求最小值,我现在有一个队列,我让他里面的值升序排列,类似于,现在我又新加进来一个
,那么他会把排在他前面的比他大的数踢掉,就变成了
。
我们可以得出队列里面的值的下标一定是递增的,因为是按顺序加进去的,然后当队首和当前位置相差很远的时候,也把队首踢掉
#include <bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define pii pair<int,int>
#define int long long
const int inf = 0x3f3f3f3f;
const int maxn = 1001110;
const int M = 1e9+7;
int n,m,k,ok;
int a[maxn];
int q[maxn];
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>k;
for(int i = 1; i <= n; i++)
{
cin>>a[i];
}
int h = 1,r = 0;
for(int i = 1; i <= n; i++) //处理最小值
{
while(h <= r && i >= q[h]+k) h++;
while(h <= r && a[q[r]] >= a[i]) r--;
q[++r] = i;
if(i >= k) cout<<a[q[h]]<<' ';
}
cout<<endl;
h = 1,r = 0;
for(int i = 1; i <= n; i++) //处理最大值
{
while(h <= r && i >= q[h]+k) h++;
while(h <= r && a[q[r]] <= a[i]) r--;
q[++r] = i;
if(i >= k) cout<<a[q[h]]<<' ';
}
cout<<endl;
return 0;
} 
京公网安备 11010502036488号