monotone queue(单调队列)

描述

单调队列是这样一种东西,给你一个队列,让你在队尾添加元素,在队首删除元素,时刻维护队列中的最大值,使其查询时间为 O(1)

实现

可以用一个辅助队列来维护其中的最大值从而让其原队列不做改变,并且该队列中的元素是单调的,具体来讲可以用两个stl中的deque( d ouble e nd q ueue),来维护,其实现非常简单。

push

在队尾插入一个元素的时候,主要做的修改在辅助队列中,对于辅助队列中的元素,从后往前比较如果back比加入元素大,就删掉,可以理解为因为这些元素(删掉的)在新加入元素的后面,所以无论如何也不可能成为最大元素,因为后面那个在队列中的一定比他大。

pop

在队首删除一个元素的时候,和辅助队列中的最大元素作比较,如果相等,同时删掉辅助队列中的元素从而让次大者上位。

类模板

template <typename Item>struct monotone_queue
{
    std::deque<Item> data,aux;//原本队列之外的辅助队列
    int size(){return data.size();}
    void push(Item it)
    {
        data.push_back(it);
        while(!aux.empty() && aux.back()<it)aux.pop_back();
        aux.push_back(it);
    }
    void pop()
    {
        if(data.front() == aux.front())aux.pop_front();
        data.pop_front();
    }
    Item max()
    {
        return aux.front();
    }
};

Acknowledge

Hellc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值