描述
单调队列是这样一种东西,给你一个队列,让你在队尾添加元素,在队首删除元素,时刻维护队列中的最大值,使其查询时间为 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();
}
};