标签:单调队列
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