您的位置:首页 > 其它

POJ2823 Sliding Window (单调队列的基本应用)

2014-12-16 16:35 423 查看
题目链接:

http://poj.org/problem?id=2823

题意:

 给定一个长度为n的序列,求每个长度为k的区间的最大值与最小值

分析:

单调队列的基本应用

代码如下:

<span style="font-size:14px;">#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;

const int maxn = 1000010;

int a[maxn];

int main()
{
int n,k;
while(~scanf("%d%d",&n,&k)){
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
deque<int > mmax;
deque<int > mmin;
for(int i=1;i<=n;i++){
while(!mmin.empty()&&a[i]<a[mmin.back()]) mmin.pop_back();
mmin.push_back(i);
if(i>=k){
while(!mmin.empty()&&mmin.front()<=i-k)
mmin.pop_front();
if(i==n)
printf("%d\n",a[mmin.front()]);
else
printf("%d ",a[mmin.front()]);
}
}
for(int i=1;i<=n;i++){
while(!mmax.empty()&&a[i]>a[mmax.back()]) mmax.pop_back();
mmax.push_back(i);
if(i>=k){
while(!mmax.empty()&&mmax.front()<=i-k)
mmax.pop_front();
if(i==n)
printf("%d\n",a[mmax.front()]);
else
printf("%d ",a[mmax.front()]);
}
}
}
return 0;
}
</span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: