题意:给你n,k,表示n个数,在连续的k个数的区间(从第一个元素开始)中,输出最大值和最小值。
用两个单调队列,一个放最大值一个放最小值。队列里放的是下标。
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <queue>
#include <vector>
using namespace std;
const int maxn = 1e6+10;
int a[maxn];
int minn[maxn],maxx[maxn];
int main()
{
int n,k;
scanf("%d %d",&n,&k);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
int front1=0,tail1=-1;
int front2=0,tail2=-1;
int i=0;
for(i=0;i<k;i++)
{
while(front1<=tail1&&a[i]>=a[maxx[tail1]])//要=,尽量取最大的下标
tail1--;
maxx[++tail1]=i;
while(front2<=tail2&&a[i]<=a[minn[tail2]])
tail2--;
minn[++tail2]=i;
}
printf("%d",a[minn[front2]]);
for(;i<n;i++)
{
while(front2<=tail2&&a[i]<=a[minn[tail2]])
tail2--;
minn[++tail2]=i;
while(minn[front2]<(i-k+1)) front2++;
printf(" %d",a[minn[front2]]);
}
printf("\n");
printf("%d",a[maxx[front1]]);
for(i=k;i<n;i++)
{
while(front1<=tail1&&a[i]>=a[maxx[tail1]])
tail1--;
maxx[++tail1]=i;
while(maxx[front1]<(i-k+1)) front1++;
printf(" %d",a[maxx[front1]]);
}
printf("\n");
return 0;
}