双端队列操作
push_front()
pop_front()
push_back()
pop_back()
insert()
erase()
应用
求区间最值
如果维护区间最小值,那么维护的队列就是单调递增的。
如果维护区间最大值,那么维护的队列就是单调递减的。
模板
deque<int> Q;
for (int i = 0; i < n; ++i)
{
if (!Q.empty() && i - Q.front() >= m)
Q.pop_front();
while (!Q.empty() && V[Q.back()] < V[i]) //求区间最小值把这里改成>
Q.pop_back();
Q.push_back(i);
if (i >= m - 1)
cout << V[Q.front()] << " ";
}
例题
P2216 [HAOI2007] 理想的正方形 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)