POJ 2823 Sliding Window
2015-07-29 14:52
204 查看
Sliding Window
Description
An array of size n ≤ 106 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.
Your task is to determine the maximum and minimum values in the sliding window at each position.
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
Sample Output
Description
An array of size n ≤ 106 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.
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 |
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<cstdio> #include<malloc.h> using namespace std; struct node { int val; int pos; }; int main() { //freopen("in.txt","r",stdin); int i; int head1,end1,head2,end2; int m,n; while(~scanf("%d%d",&m,&n)) { int *p=(int*)malloc(sizeof(int)*m); int *ans1=(int*)malloc(sizeof(int)*m); int *ans2=(int*)malloc(sizeof(int)*m); node *que1=(node*)malloc(sizeof(node)*m); node *que2=(node*)malloc(sizeof(node)*m); for(i=0;i<m;i++) scanf("%d",&p[i]); head1=head2=1,end1=end2=0; for(i=0;i<m;i++) { node temp; temp.pos=i; temp.val=p[i]; while(end1!=0&&que1[end1].val<p[i]&&head1<=end1) end1--; end1++; que1[end1]=temp; while(end1!=0&&que1[head1].pos<i-n+1&&head1<=end1) head1++; ans1[i]=que1[head1].val; while(end2!=0&&que2[end2].val>p[i]&&head2<=end2) end2--; end2++; que2[end2]=temp; while(end2!=0&&que2[head2].pos<i-n+1&&head2<=end2) head2++; ans2[i]=que2[head2].val; } for(i=n-1;i<m-1;i++) printf("%d ",ans2[i]); printf("%d\n",ans2[i]); for(i=n-1;i<m-1;i++) printf("%d ",ans1[i]); printf("%d\n",ans1[i]); free(ans1),free(ans2),free(que1),free(que2),free(p); } return 0; }
相关文章推荐
- php 正则表达式捕获组与非捕获组
- 简单的一个哈希查找函数
- 多线程学习总结
- poj 2342 Anniversary party(树形dp)
- Win10正式发布 190个国家和地区免费升级或购买预装电脑获取
- OC特有语法—@property
- HDOJ 5318 The Goddess Of The Moon 矩阵快速幂
- leveldb 性能、使用场景评估
- 快速排序的两种实现
- html加载顺序、onload、JQ.ready()
- Maven项目模板
- LeetCode(78) Subsets
- css弹出遮罩层
- 快速清除Andorid项目中无用资源
- 浅拷贝和深拷贝
- Android实例-退出程序(XE8+小米2)
- Easyui 中的placeholder属性
- 启动spark集群
- Oracle 学习之RMAN(三)全量备份
- 【转】深入剖析ConcurrentHashMap(2)