想清楚两件事:
1.当前区间前面的元素没用
2.当前区间有了较小的元素,则以前较大的元素没用,因为当前用不到,以后更用不到。
#include<cstdio>
#define MAXN 1000000
struct node{
int val,pos;
}que[MAXN+10];
int n,k,a[MAXN+10],mn[MAXN+10],mx[MAXN+10];
void read()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
}
void DP()
{
int front=0,rear=0;
for(int i=1;i<=k;i++){
while(front<rear){
if(que[rear-1].val>=a[i])
rear--;
else
break;
}
que[rear].pos=i,que[rear].val=a[i];
rear++;
}
for(int i=k+1;i<=n+1;i++){
while(front<rear){
if(que[front].pos<i-k)
front++;
else
break;
}
mn[i-k]=que[front].val;
while(front<rear){
if(que[rear-1].val>=a[i])
rear--;
else
break;
}
que[rear].pos=i,que[rear].val=a[i];
rear++;
}
front=rear=0;
for(int i=1;i<=k;i++){
while(front<rear){
if(que[rear-1].val<=a[i])
rear--;
else
break;
}
que[rear].pos=i,que[rear].val=a[i];
rear++;
}
for(int i=k+1;i<=n+1;i++){
while(front<rear){
if(que[front].pos<i-k)
front++;
else
break;
}
mx[i-k]=que[front].val;
while(front<rear){
if(que[rear-1].val<=a[i])
rear--;
else
break;
}
que[rear].pos=i,que[rear].val=a[i];
rear++;
}
}
int main()
{
read();
DP();
for(int i=1;i<=n-k+1;i++)
printf("%d ",mn[i]);
printf("\n");
for(int i=1;i<=n-k+1;i++)
printf("%d ",mx[i]);
}