POJ 2823 Sliding Window
2012-05-01 14:17
597 查看
感谢lzxskjo先生让我“剽窃”他的劳动成果。当然,更要感谢被他剽窃了的那个人。
以下引用某论文:
一. 什么是单调(双端)队列
单调队列,顾名思义,就是一个元素单调的队列,那么就能保证队首的元素是最小(最大)的,从而满足动态规划的最优性问题的需求。
单调队列,又名双端队列。双端队列,就是说它不同于一般的队列只能在队首删除、队尾插入,它能够在队首、队尾同时进行删除。
【单调队列的性质】
一般,在动态规划的过程中,单调队列中每个元素一般存储的是两个值:
1. 在原数列中的位置(下标)
2. 他在动态规划中的状态值
而单调队列则保证这两个值同时单调。
从以上看,单调队列的元素最好用一个类来放,不这样的话,就要开两个数组。。。
插入方法(以最大单调队列为例):
在插入一个元素前,先判断队列是否为空(head<=tail),然后再判断队尾元素是否比要插入的元素小(q[tail].val<data[insert]),如果是的话,则将队尾元素删除(--tail)。
重复以上过程,直至为空或队尾元素比其大。
删除方法:
这个要根据具体题目而定。在本题是如果当前的INDEX与队首的INDEX相差大于等于K,则删除。
View Code
以下引用某论文:
一. 什么是单调(双端)队列
单调队列,顾名思义,就是一个元素单调的队列,那么就能保证队首的元素是最小(最大)的,从而满足动态规划的最优性问题的需求。
单调队列,又名双端队列。双端队列,就是说它不同于一般的队列只能在队首删除、队尾插入,它能够在队首、队尾同时进行删除。
【单调队列的性质】
一般,在动态规划的过程中,单调队列中每个元素一般存储的是两个值:
1. 在原数列中的位置(下标)
2. 他在动态规划中的状态值
而单调队列则保证这两个值同时单调。
从以上看,单调队列的元素最好用一个类来放,不这样的话,就要开两个数组。。。
插入方法(以最大单调队列为例):
在插入一个元素前,先判断队列是否为空(head<=tail),然后再判断队尾元素是否比要插入的元素小(q[tail].val<data[insert]),如果是的话,则将队尾元素删除(--tail)。
重复以上过程,直至为空或队尾元素比其大。
删除方法:
这个要根据具体题目而定。在本题是如果当前的INDEX与队首的INDEX相差大于等于K,则删除。
View Code
#include <stdio.h> #define MAXN 1000001 int a[MAXN],bque[MAXN],sque[MAXN]; int n,k; void getmax() { int i,head = 1,tail = 1; for(i = 1;i < k;i++) { while(tail >= head && a[i] > a[bque[tail]])//队列不为空且当前元素大于队尾元素 tail--;//删除队尾元素 tail++; bque[tail] = i; } for(i = k;i <= n;i++) { while(tail >= head && i - bque[head] >= k)//队列不为空,且当前元素下标减去队首元素的下标>=k head++;//删除队首元素 while(tail >= head && a[i] > a[bque[tail]])//队列不为空且当前元素大于队尾元素 tail--; tail++; bque[tail] = i; if(i != n) printf("%d ",a[bque[head]]); } printf("%d\n",a[bque[head]]); } void getmin() { int i,head = 1,tail = 1; for(i = 1;i < k;i++) { while(tail >= head && a[i] < a[sque[tail]]) tail--; tail++; sque[tail] = i; } for(i = k;i <= n;i++) { while(tail >= head && i - sque[head] >= k) head++; while(tail >= head && a[i] < a[sque[tail]]) tail--; tail++; sque[tail] = i; if(i != n) printf("%d ",a[sque[head]]); } printf("%d\n",a[sque[head]]); } int main() { while(~scanf("%d%d",&n,&k)) { for(int i = 1;i <= n;i++) scanf("%d",&a[i]); getmin(); getmax(); } return 0; }
相关文章推荐
- poj 2823 Sliding Window
- POJ 2823 Sliding Window [单调队列]【杂类】
- POJ 2823 Sliding Window(单调队列)
- poj 2823 Sliding Window (线段树,RMQ)
- 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 (单调队列 or 线段树)
- 【单调队列】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 (STL超时版)