本来想看一个题的解题报告,无意中搜索到这个题,因为这个题主要是单调队列,所以就做了。
关于单调队列请看:http://www.felix021.com/blog/read.php?1965
最后再参考了这位大牛的博客:http://blog.csdn.net/hyogahyoga/article/details/7829830
然后基本懂了,主要是觉得这位大牛实现得比较简单,膜拜~
直接代码吧:
#include<cstdio>
#include<cstring>
#define MAX 1000001
int n,k,a[MAX],q[MAX];
void GetMin()
{
int front=1,last=q[1]=1;
for(int i=1;i<=n;i++)
{
if(front<=last&&q[front]<i-k+1)
front++;
while(front<=last&&a[i]<=a[q[last]])
last--;
q[++last]=i;
if(i>=k)
printf("%d%c",a[q[front]],i==n?'\n':' ');
}
}
void GetMax()
{
int front=1,last=q[1]=1;
for(int i=1;i<=n;i++)
{
if(front<=last&&q[front]<i-k+1)
front++;
while(front<=last&&a[i]>=a[q[last]])
last--;
q[++last]=i;
if(i>=k)
printf("%d%c",a[q[front]],i==n?'\n':' ');
}
}
int main()
{
while(scanf("%d%d",&n,&k)!=EOF)
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
GetMin();
GetMax();
}
return 0;
}