什么叫单调?
• 一些数据从小到大排列 —— 单调递增
• 从大到小排列 —— 单调递减
单调队列
• 单调递增的队列:在队列的基础上,时刻保持队列中的元素单调递增。
• 单调递减的队列:在队列的基础上,时刻保持队列中的元素单调递减。
怎么做到?
• 除了队首可以出队外,新增一个在队尾出队的操作;
• 新元素要进队,先让不满足单调性的元素从队尾出队。
举个例子
• 元素是整数,单调递增的队列,允许重复元素
• 一开始是个空队列
• 数字 3进队 空队列,直接进队
• 数字 5进队 能保持单调性,直接进队
• 数字 8进队 能保持单调性,直接进队
• 数字 5进队 不能保持单调性,先将 8出队,再让 5进队
• 出队 数字 3出队
• 数字 9进队 能保持单调性,直接进队
• 数字 4进队 先让 5,5,9 都出队,再让 4进队
• 出队 数字 4出队
单调队列需要用到一个用C++ 自带的双端队列 deque,它可以从队首和队尾加入或删除元素。
deque<int> q;
性质 1:
• 一个元素进队时,从队尾删除了一些元素
• 删完后,自己入队之前,“先进队的元素中最后一个比自己小的”恰好在队尾
• 性质 2:
• 一个元素进队时,从队尾删除了一些元素
• 自己是它们的“后进队的元素中第一个比自己小的”
例题:
nkoj 2152