POJ - 2823 Sliding Window (单调队列求解区间最值)
2016-07-27 10:23
561 查看
POJ - 2823 Sliding Window
Description An array of size n ≤ 10 6 is given to you. There is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in the window. Each time the sliding window moves rightwards by one position. Following is an example: The array is [1 3 -1 -3 5 3 6 7], and k is 3.
Input The input consists of two lines. The first line contains two integers n and k which are the lengths of the array and the sliding window. There are n integers in the second line. Output There are two lines in the output. The first line gives the minimum values in the window at each position, from left to right, respectively. The second line gives the maximum values. 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 #include <map> #include <cmath> #include <vector> #include <cstdio> #include <cstring> #include <algorithm> #define uint unsigned int typedef long long LL; using namespace std; const int MAXN = 1e6 + 5; int stamin[MAXN], stamax[MAXN]; LL A[MAXN]; int MinB[MAXN], MaxB[MAXN]; int n, k, x, cnt; int main() { while(~scanf("%d%d", &n, &k)) { int top1 = 0, rear1 = 0, top2 = 0, rear2 = 0; cnt = 0; for(int i = 0; i < n; i ++) { scanf("%lld", &A[i]); while(rear1 > top1 && A[stamin[rear1 - 1]] > A[i]) rear1 --; stamin[rear1 ++] = i; while(stamin[top1] < i - k + 1) top1 ++; MinB[cnt] = stamin[top1]; while(rear2 > top2 && A[stamax[rear2 - 1]] < A[i]) rear2 --; stamax[rear2 ++] = i; while(stamax[top2] < i - k + 1) top2 ++; MaxB[cnt ++] = stamax[top2]; } for(int i = k - 1; i < n; i ++) { printf("%lld%c", A[MinB[i]], i == n - 1 ? '\n' : ' '); } for(int i = k - 1; i < n; i ++) { printf("%lld%c", A[MaxB[i]], i == n - 1 ? '\n' : ' '); } } return 0; } |
相关文章推荐
- 【C# DateTime】如何一次性修改DateTime的默认ToString格式
- Android自定义控件之基本原理(一)
- solr5.0.0的使用(二)
- Redis HyperLogLog
- POJ3126 - Prime Path
- 简单的调用第三方XlistView的上拉加载下拉刷新
- js判断打开设备
- 如何将下载的谷歌卫星地图导出成多张等份大图
- 湘潭oj 1247 Pair-Pair
- docker命令详解
- (LeetCode)Contains Duplicate II --- 查找重复的元素升级版
- Linux命令(16)压缩,解压文件
- 使用GPIO模拟I2C总线进行通信
- windows 8.1 windows 10 自动应答文件的创建
- 运维日记006 - vim操作总结(二、常用命令)
- fork函数与vfork函数
- [转]HTTP 头部详细解释
- 七.闭包
- Redis 有序集合(sorted set)
- easyui treegrid动态加载树形列表