POJ 2823单调队列 数组写法
2015-07-25 15:47
316 查看
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
Source
POJ Monthly--2006.04.28, Ikki
Time Limit: 12000MS | Memory Limit: 65536K | |
Total Submissions: 46443 | Accepted: 13422 | |
Case Time Limit: 5000MS |
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
Source
POJ Monthly--2006.04.28, Ikki
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; #define maxn 1000000 + 10 int a[maxn]; int Q[maxn]; int p[maxn]; int Min[maxn]; int Max[maxn]; int n, k; void get_min() { int head = 1, tail = 0;//初始条件 队列为空 for(int i=1; i<k; i++) { while(head <= tail && Q[tail] >= a[i])//进队维护条件 tail--; Q[++tail] = a[i]; p[tail] = i; } for(int i=k; i<=n; i++) { while(head <= tail && Q[tail] >= a[i]) tail--; Q[++tail] = a[i]; p[tail] = i; while(p[head] < i-k+1) head++; Min[i] = Q[head]; } } void get_max() { int head = 1, tail = 0; for(int i=1; i<k; i++) { while(head <= tail && Q[tail] <= a[i]) tail--; Q[++tail] = a[i]; p[tail] = i; } for(int i=k; i<=n; i++) { while(head <= tail && Q[tail] <= a[i]) tail--; Q[++tail] = a[i]; p[tail] = i; while(p[head] < i-k+1) head++; Max[i] = Q[head]; } } int main() { while(~scanf("%d%d", &n, &k)) { for(int i=1; i<=n; i++) scanf("%d", &a[i]); get_min(); for(int i=k; i<=n; i++) i==n ? printf("%d\n", Min[i]) : printf("%d ", Min[i]); get_max(); for(int i=k; i<=n; i++) i==n ? printf("%d\n", Max[i]) : printf("%d ", Max[i]); } return 0; }
相关文章推荐
- JavaStuNote 6
- 浅析函数调用栈
- hdoj 1241 Oil Deposits (dfs)
- 16.3Sum Closest (Two-Pointers)
- JAVA注解
- android观察者设计模式 下载进度同步显示
- vivo X5 Pro拆机图解
- Android DownloadManager 的使用
- 重学java23种设计模式(2)抽象工厂模式
- iOS- 利用AFNetworking(AFN) - 实现文件上传
- Linux文件搜索命令
- hihocoder 1172 博弈游戏·Nim游戏·二
- 重拍NBA50大
- 进程与线程的一个简单解释
- Linux环境下编程(一)——进程fork()的使用
- 我的文档 属性设置里找不到位置选项,以及目录迁移解决方案
- 2、朴素贝叶斯法
- JAVA中使用FTPClient上传下载
- 深入浅出CChart 每日一课——快乐高四第六课 二丫的青梅,返璞归真之普通窗口多区域绘图
- Android Log及其参数的使用