POJ - 2823 Sliding Window: 滑动窗口 单调队列
2017-08-04 10:14
633 查看
题目点此跳转
思路
题目意思是给你一个数组,让你分别求出所有的区间长度为k的区间的最小值和最大值。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 |
代码
#include <algorithm> #include <iostream> #include <sstream> #include <utility> #include <string> #include <vector> #include <queue> #include <map> #include <set> #include <cstring> #include <cstdio> #include <cmath> #define met(a,b) memset(a, b, sizeof(a)); #define IN freopen("in.txt", "r", stdin); #define OT freopen("ot.txt", "w", stdout); using namespace std; typedef long long LL; typedef pair<int, int> PII; const int maxn = 1e6 + 100; const LL INF = 0x7fffffff; const int dir[5][2] = {0,0,-1,0,1,0,0,-1,0,1}; const int MOD = 1e9 + 7; const double eps = 1e-6; int n, k, a[maxn], q[maxn], ft, rr; int pos[maxn]; int main() { #ifdef _LOCAL IN; //OT; #endif // _LOCAL while(scanf("%d%d", &n, &k) == 2) { for(int i = 1; i <= n; ++i) scanf("%d", &a[i]); ft = rr = 0; met(pos, 0); q[rr++] = a[1]; pos[rr-1] = 1; for(int i = 2; i <= k; ++i) { while(rr > ft && q[rr-1] > a[i]) --rr; q[rr++] = a[i], pos[rr-1] = i; } printf("%d ", q[ft]); for(int i = k+1; i <= n; ++i) { while(rr > ft && q[rr-1] > a[i]) --rr; q[rr++] = a[i], pos[rr-1] = i; if(pos[ft] < i-k+1) ++ft; printf("%d ", q[ft]); } printf("\n"); ft = rr = 0; met(pos, 0); q[rr++] = a[1]; pos[rr-1] = 1; for(int i = 2; i <= k; ++i) { while(rr > ft && q[rr-1] < a[i]) --rr; q[rr++] = a[i], pos[rr-1] = i; } printf("%d ", q[ft]); for(int i = k+1; i <= n; ++i) { while(rr > ft && q[rr-1] < a[i]) --rr; q[rr++] = a[i], pos[rr-1] = i; if(pos[ft] < i-k+1) ++ft; printf("%d ", q[ft]); } printf("\n"); } return 0; }
相关文章推荐
- POJ 2823 Sliding Window 滑动窗口 单调队列优化
- POJ 2823 Sliding Window(滑动窗口问题__优先队列||单调队列)
- POJ 2823 Sliding Window 单调队列优化 滑动窗口
- POJ 题目2823 Sliding Window(单调队列求定长区间最大值)
- POJ 2823 Sliding Window 单调队列
- poj 2823 Sliding Window (单调队列)
- POJ 2823 Sliding Window 【单调队列】
- POJ 2823 Sliding Window (单调队列)
- poj 2823 Sliding Window ( 单调队列 )
- [POJ 2823] Sliding Window (单调队列)
- poj 2823 Sliding Window(单调队列)
- POJ 2823 Sliding Window(单调队列||线段树)
- POJ 2823 Sliding Window(单调队列)
- POJ 2823 Sliding Window (单调队列)
- poj 2823 Sliding Window(单调队列)
- POJ 2823 Sliding Window(单调队列)
- poj 2823 Sliding Window 【单调队列】
- POJ 2823 Sliding Window【单调队列】
- 【单调队列】POJ_2823 Sliding Window
- POJ 2823 Sliding Window(单调队列)