标签:单调队列
| Time Limit: 12000MS | Memory Limit: 65536K | |
| Total Submissions: 36212 | Accepted: 10723 | |
| Case Time Limit: 5000MS | ||
Description
| Window position | Minimum value | Maximum value |
|---|---|---|
| [1 3 -1] -3 5 3 6 7 | -1 | 3 |
| 1 [3 -1 -3] 5 3 6 7 | -3 | 3 |
| 1 3 [-1 -3 5] 3 6 7 | -3 | 5 |
| 1 3 -1 [-3 5 3] 6 7 | -3 | 5 |
| 1 3 -1 -3 [5 3 6] 7 | 3 | 6 |
| 1 3 -1 -3 5 [3 6 7] | 3 | 7 |
Your task is to determine the maximum and minimum values in the sliding window at each position.
Input
Output
Sample Input
8 3 1 3 -1 -3 5 3 6 7
Sample Output
-1 -3 -3 -3 3 3 3 3 5 5 6 7
Source
解题思路:
被单调队列搞得头痛欲裂,这里不解释了。
代码:
#include <iostream>
#include <stdio.h>
using namespace std;
const int maxn=1000005;
int n,k;
int q1[maxn],q2[maxn],num[maxn],Min[maxn],Max[maxn];
int front1,rear1,front2,rear2,cnt1,cnt2;
void in1(int i)//入队,单调递增,保存最小值
{
while(front1<=rear1&&num[q1[rear1]]>num[i])
rear1--;
q1[++rear1]=i;
}
void in2(int i)//单调递减,保存最大值
{
while(front2<=rear2&&num[q2[rear2]]<num[i])
rear2--;
q2[++rear2]=i;
}
void out1(int i)
{
if(q1[front1]<=i-k)
front1++;
Min[cnt1++]=num[q1[front1]];
}
void out2(int i)
{
if(q2[front2]<=i-k)
front2++;
Max[cnt2++]=num[q2[front2]];
}
int main()
{
while(~scanf("%d%d",&n,&k))
{
front1=front2=cnt1=cnt2=0;
rear1=rear2=-1;
for(int i=1;i<=n;i++)
scanf("%d",&num[i]);
for(int i=1;i<k;i++)//前k-1个数只入队,因为不可能达到出队条件
{
in1(i);in2(i);
}
for(int i=k;i<=n;i++)
{
in1(i);out1(i);
in2(i);out2(i);
}
for(int i=0;i<cnt1-1;i++)
printf("%d ",Min[i]);
printf("%d\n",Min[cnt1-1]);
for(int i=0;i<cnt2-1;i++)
printf("%d ",Max[i]);
printf("%d\n",Max[cnt2-1]);
}
return 0;
}
[ACM] poj 2823 Sliding Window(单调队列),布布扣,bubuko.com
[ACM] poj 2823 Sliding Window(单调队列)
标签:单调队列
原文地址:http://blog.csdn.net/sr_19930829/article/details/24838167