单调队列,在队尾插入,删除。在队头删除。
在求最大值的时候,把每个插入的元素与队列尾的元素逐一比较,只要队尾元素比插入的元素小就删除队尾元素,直到队尾元素比待插入元素大为止。
同时还要删除过期元素,过期元素从队头进行删除,直到满足当前插入元素的下标-间距+1<=对头元素的下标为止。
求最小值同理。。。
最后不得不说这段代码跑了9735MS,AC的好险啊。。。
#include<iostream>
#include<stdio.h>
#include<deque>
using namespace std;
int a[1000010],ans1[1000010],ans2[1000010];
int n,k;
int main()
{
while(scanf("%d%d",&n,&k)!=EOF)
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
deque<int>q1,q2;
q1.clear();
q2.clear();
for(int i=1;i<=n;i++)
{
while(!q1.empty()&&a[i]<a[q1.back()])
q1.pop_back();
while(!q1.empty()&&i-k+1>q1.front())
q1.pop_front();
q1.push_back(i);
ans1[i]=a[q1.front()];
while(!q2.empty()&&a[i]>a[q2.back()])
q2.pop_back();
while(!q2.empty()&&i-k+1>q2.front())
q2.pop_front();
q2.push_back(i);
ans2[i]=a[q2.front()];
}
for(int i=k;i<=n;i++)
{
if(i<n)
printf("%d ",ans1[i]);
else
printf("%d\n",ans1[n]);
}
for(int i=k;i<=n;i++)
{
if(i<n)
printf("%d ",ans2[i]);
else
printf("%d\n",ans2[n]);
}
}
return 0;
}
poj 2823 Sliding Window
最新推荐文章于 2019-08-13 20:25:55 发布