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