一、基本概念
单调队列是指:单调递增或单调递减的队列。所以它也有如下几个性质:
1.队列中的元素在原来的列表中的位置是由前往后的(随着循环顺序入队)。
2.队列中元素的大小是单调递增或递减的。
3.从队尾入列,队首或队尾出列
时间复杂度:O(N)
二、例题
1.最大子序和(dp+单调队列优化)
题目描述
输入一个长度为n的整数序列,从中找出一段不超过m的连续子序列,使得整个序列的和最大。
例如 1,-3,5,1,-2,3
当m=4时,S=5+1-2+3=7
当m=2或m=3时,S=5+1=6
输入
第一行两个数n,m(n,m≤300000)(n,m \leq 300000)(n,m≤300000)
第二行有n个数,要求在n个数找到最大子序和
输出
一个数,数出他们的最大子序和
样例输入
6 4
1 -3 5 1 -2 3
样例输出
7
题解:
计算区间和的问题,一般转化为连个前缀和相减的形式进行求解。我们可以先求出S[i]表示序列里前 i i i项的和,则连续子序列 [ L , R ] [L,R] [L,R]中的和就等于 S [ R ] − S [ L − 1 ] S[R]-S[L-1] S[R]−S[L−1].所以我们可以非常巧妙地将原问题转化为:找出两个位子h和t,使 S [ h ] − S [ t ] S[h]-S[t] S[h]−S[t]最大并且 y − x < = m y-x<=m y−x<=m
首先枚举右端点 i i i,当 i i i固定时,问题就变为:找到一个右端点 j j j,其中j属于 [ i − m , i − 1 ] [i-m,i-1] [i−