POJ 2823 Sliding Window 单调队列
来源:互联网 发布:h618b改端口 编辑:程序博客网 时间:2024/05/01 15:21
Sliding Window
Time Limit: 12000MSMemory Limit: 65536KTotal Submissions: 55893Accepted: 16072Case Time Limit: 5000MS
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 -13 1 [3 -1 -3] 5 3 6 7 -33 1 3 [-1 -3 5] 3 6 7 -35 1 3 -1 [-3 5 3] 6 7 -35 1 3 -1 -3 [5 3 6] 7 36 1 3 -1 -3 5 [3 6 7]37
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
8 31 3 -1 -3 5 3 6 7
Sample Output
-1 -3 -3 -3 3 33 3 5 5 6 7
Source
POJ Monthly–2006.04.28, Ikki
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int SZ = 1000010;struct Queue{ int v, pos;}Q[SZ];int num[SZ], n, k, Min[SZ], Max[SZ];int read(){ int num = 0, f = 1; char c = getchar(); while(c < '0' || c > '9'){if(c == '-') f = -1; c = getchar();} while('0' <= c && c <= '9'){num = num * 10 + (c - '0'); c = getchar();} return num * f;}void get_min(){ int head = 1, tail = 0, cnt = 0; for(int i = 1; i < k; i++) { while(head <= tail && Q[tail].v > num[i]) tail--; tail++; Q[tail].v = num[i]; Q[tail].pos = i; } for(int i = k; i <= n; i++) { while(head <= tail && Q[tail].v > num[i]) tail--; tail++; Q[tail].v = num[i]; Q[tail].pos = i; while(i - Q[head].pos >= k) head++; Min[++cnt] = Q[head].v; }}void get_max(){ int head = 1, tail = 0, cnt = 0; for(int i = 1; i < k; i++) { while(head <= tail && Q[tail].v < num[i]) tail--; tail++; Q[tail].v = num[i]; Q[tail].pos = i; } for(int i = k; i <= n; i++) { while(head <= tail && Q[tail].v < num[i]) tail--; tail++; Q[tail].v = num[i]; Q[tail].pos = i; while(i - Q[head].pos >= k) head++; Max[++cnt] = Q[head].v; }}int main(){ while(~scanf("%d%d", &n, &k)) { for(int i = 1; i <= n; i++) num[i] = read(); get_min(); memset(Q, 0, sizeof(Q)); get_max(); int end = n - k + 1; for(int i = 1; i <= end; i++) printf("%d%c", Min[i], i == end ? '\n' : ' '); for(int i = 1; i <= end; i++) printf("%d%c", Max[i], i == end ? '\n' : ' '); } return 0;}
0 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 (单调队列)
- js检验台湾身份证是否合法
- Android官方开发文档Training系列课程中文版:Activity测试之测试环境配置
- sensor time 传感器时间戳
- 习题4-2 正方形 UVa201
- rw_程序是怎样跑起来的 7-12章
- POJ 2823 Sliding Window 单调队列
- git 基本操作命令
- 根据MVP项目设计模式模拟的登录功能
- python 异常处理
- linux ubuntu下安装java,mysql与tomcat,redis
- java变量的初始化顺序小结
- spring注解
- 安卓开发中,在低版本SDK使用高版本的API会报错。一般处理方法是换一种实现方法,或者在高版本SDK中使用高版本API,低版本SDK中使用效果可能会差点的折衷方案;后者可以用如下技巧来实现。
- weblogic部署失败