解题思路
滑动窗口之单调队列经典例题。。(应该用线段树/RMQ等也能过)
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cstring>
#include<cmath>
#include<map>
#include<queue>
#define ll long long
#define ldb long double
using namespace std;
int n,k,a[1000010],q[1000010],h,t,mx[1000010],mi[1000010];
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
h=1,t=0;
for(int i=1;i<=n;i++)
{
while(h<=t&&i-q[h]>=k)h++;
while(h<=t&&a[q[t]]<a[i])t--;
q[++t]=i;
mx[i]=a[q[h]];
}
h=1,t=0;
for(int i=1;i<=n;i++)
{
while(h<=t&&i-q[h]>=k)h++;
while(h<=t&&a[q[t]]>a[i])t--;
q[++t]=i;
mi[i]=a[q[h]];
}
for(int i=k;i<=n;i++)
printf("%d ",mi[i]);
printf("\n");
for(int i=k;i<=n;i++)
printf("%d ",mx[i]);
}
/*
8 3
-10 1 -1 -1 10 1 -9 10
*/