| Time Limit: 12000MS | Memory Limit: 65536K | |
| Total Submissions: 46435 | Accepted: 13417 | |
| 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
POJ Monthly--2006.04.28, Ikki
#include <iostream>
#include <cstdio>
#include <queue>
#include <deque>
using namespace std;
typedef pair<int, int> P;
#define maxn 1000000 + 10
deque<P> Q1;
deque<P> Q2;
int n, k;
int Min[maxn], Max[maxn];
int main()
{
while(~scanf("%d%d", &n, &k))
{
while(!Q1.empty()) Q1.pop_back();
while(!Q2.empty()) Q2.pop_back();
int x;
for(int i=1; i<=n; i++)
{
scanf("%d", &x);
while(!Q1.empty() && Q1.back().first >= x) Q1.pop_back();
Q1.push_back(P(x, i));
if(i >= k)
{
while(!Q1.empty() && Q1.front().second <= i-k) Q1.pop_front();
Min[i] = Q1.front().first;
}
while(!Q2.empty() && Q2.back().first <= x) Q2.pop_back();
Q2.push_back(P(x, i));
if(i >= k)
{
while(!Q2.empty() && Q2.front().second <= i-k) Q2.pop_front();
Max[i] = Q2.front().first;
}
}
for(int i=k; i<=n; i++)
i == n ? printf("%d\n", Min[i]) : printf("%d ", Min[i]);
for(int i=k; i<=n; i++)
i == n ? printf("%d\n", Max[i]) : printf("%d ", Max[i]);
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/dojintian/article/details/47054589