单调队列
概念
队列是类似于双端栈的一种数据结构。
单调队列与单调栈相似,是用来维护具有一定单调性的队列,与单调栈不同的是他的左端叶可以进行操作。
例题
- 求在这个固定长度内的最值。
- 使用双端队列,比用线段树或者st表更加优秀,例如求最大值,就可以比较右端比他更小的数弹出去因为他更靠右更大,同时再考虑左端元素的下标是否满足是否合法,即是否在属于这个滑动窗口。
板子
void solve()
{
int n,m;
cin>>n>>m;
deque<int> q;
vector<int> a(n+1);
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++)
{
while(!q.empty()&&i-q.front()>=m)q.pop_front();//判断元素是否合法;
while(!q.empty()&&a[q.back()]<=a[i])q.pop_back();//判断是否有更符合条件选手出现;
q.push_back(i);
if(i>=m) cout<<a[q.front()]<<endl;
}
}