http://poj.org/problem?id=2823
#include <iostream>
#include <cstdio>
using namespace std;
const int NM=1000005;
int a[NM],que[NM];
int n,len;
void Min_win()
{
int tail,head,i;
head=1;
tail=0;
for(i=1;i<=len;i++)
{
while(tail>=head&&a[que[tail]]>a[i])
tail--;
tail++;
que[tail]=i;
}
for(i=len;i<=n;i++)
{
while(tail>=head&&a[que[tail]]>a[i])
tail--;
tail++;
que[tail]=i;
while(que[head]<i-len+1)
head++;
printf("%d",a[que[head]]);
if(i<=n) printf(" ");
}
}
void Max_win()
{
int tail,head,i;
tail=0;
head=1;
for(i=1;i<=len;i++)
{
while(head<=tail&&a[que[tail]]<a[i])
tail--;
tail++;
que[tail]=i;
}
for(i=len;i<=n;i++)
{
while(head<=tail&&a[que[tail]]<a[i])
tail--;
tail++;
que[tail]=i;
while(que[head]<i-len+1)
head++;
printf("%d",a[que[head]]);
if(i<=n) printf(" ");
}
}
int main()
{
int i;
while(scanf("%d%d",&n,&len)!=EOF)
{
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
Min_win();
printf("\n");
Max_win();
printf("\n");
}
return 0;
}

本文介绍了一种使用滑动窗口求解数组中连续子数组的最小值和最大值的有效算法。通过双端队列维护当前窗口内的元素索引,并确保队列头部始终为最小或最大值的索引,从而实现高效更新。
257

被折叠的 条评论
为什么被折叠?



