ACM-单调队列之Sliding Window——poj2823

2020-11-18 19:50

阅读:736

1、如果队列的长度一定,先判断队首元素是否在规定范围内,如果超范围则增长队首。

2、每次加入元素时和队尾比较,如果当前元素小于队尾且队列非空,则减小尾指针,队尾元素依次出队,直到满足队列的调性为止

要特别注意头指针和尾指针的应用。

参考资料:http://www.cnblogs.com/neverforget/archive/2011/10/13/ll.html

http://xuyemin520.is-programmer.com/posts/25964

And 这道题就可以解决了。

/**************************************
***************************************
*        Author:Tree                  *
*From :http://blog.csdn.net/lttree    *
* Title : Sliding Window              *
*Source: poj 2823                     *
* Hint  : 单调队列                   *
***************************************
**************************************/
#include 
#define MAX 1000001
int n,k;
int pre1,pre2,lst1,lst2,len_max,len_min;    // 两个队列的头指针与尾指针,最大值的下标,最小值的下表
int num[MAX],Increase[MAX],Decrease[MAX],Max[MAX],Min[MAX];      // Num存数据,递增与递减队列,最大值,最小值的数组。
// 递增序列的压入操作
void in_max(int i)
{
    while( pre1=k )
    {
        if(Increase[pre1]num[i] )
        --lst2;
    Decrease[++lst2]=i;

    // 如果大于等于k个数,就需要向最小值数组赋值
    if( i>=k )
    {
        if(Decrease[pre2]



评论


亲,登录后才可以留言!