#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
#define M 1000005
using namespace std;
int head,rear,n,a[M],q[M],k,mi[M],ma[M];
void in_queue(int i)
{
while(head<=rear&&a[i]<=a[ q[rear] ])//入队,删除队尾元素中比它大的
rear--;
q[++rear]=i;
}
void out_queue(int i)
{
if(q[head] < i-k+1) //删除队首元素
head++;
}
void in_queue1(int i)
{
while(head<=rear && a[i]>=a[ q[rear] ])//删除队尾元素比它小的
rear--;
q[++rear]=i;
}
int main()
{
int l;
while(scanf("%d%d",&n,&k)!=EOF)
{
if(k>=n)
{
k=n;
}
l=0,head=0,rear=-1;
for(int i=1; i<=n; i++)
{
scanf("%d",&a[i]);
in_queue(i);
out_queue(i);
if(i>=k)
{
mi[l++]=a[ q[head] ];
}
}
l=0,head=0,rear=-1;
for(int i=1; i<=n ; i++)
{
in_queue1(i);
out_queue(i);
if(i>=k)
ma[l++]=a[ q[head] ];
}
for(int i=0; i<n-k+1 ; i++)
printf("%d ",mi[i]);
printf("\n");
for(int i=0; i<n-k+1 ; i++)
printf("%d ",ma[i]);
printf("\n");
}
return 0;
}
poj2823-单调队列
最新推荐文章于 2020-04-15 14:48:58 发布