http://poj.org/problem?id=2823
单调栈和队列主要思想差不多 就是单调队列会从首部弹出元素
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct node
{
int id;
int val;
};
node que1[1000010],que2[1000010];
int ary[1000010],minn[1000010],maxx[1000010];
int n,k,head1,tail1,head2,tail2;
int main()
{
node cur,tmp;
int i;
while(scanf("%d%d",&n,&k)!=EOF)
{
for(i=1;i<=n;i++)
{
scanf("%d",&ary[i]);
}
head1=0,tail1=-1,head2=0,tail2=-1;
for(i=1;i<=n;i++)
{
while(head1<=tail1&&que1[tail1].val>=ary[i]) tail1--;
tmp.id=i,tmp.val=ary[i];
que1[++tail1]=tmp;
while(head2<=tail2&&que2[tail2].val<=ary[i]) tail2--;
tmp.id=i,tmp.val=ary[i];
que2[++tail2]=tmp;
if(i>=k)
{
minn[i-k+1]=que1[head1].val;
maxx[i-k+1]=que2[head2].val;
if(i-k+1>=que1[head1].id) head1++;
if(i-k+1>=que2[head2].id) head2++;
}
}
for(i=1;i<=n-k+1;i++)
{
printf("%d",minn[i]);
if(i<n-k+1) printf(" ");
else printf("\n");
}
for(i=1;i<=n-k+1;i++)
{
printf("%d",maxx[i]);
if(i<n-k+1) printf(" ");
else printf("\n");
}
}
return 0;
}