【模板】deque实现单调队列
双端队列deque容器:
关于deque最常用的有这几个函数:

都是成员函数
双端队列模板题:【洛谷】P2952 [USACO09OPEN]牛线Cow Line
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<deque>
using namespace std; int n, cnt;
deque<int> q; int main() {
scanf("%d\n", &n);
char s[];
for(int i=; i<=n; ++i) {
gets(s);
if(s[] == 'A')
if(s[] == 'L') q.push_front(++cnt);
else q.push_back(++cnt);
if(s[] == 'D') {
int m = , j = ;
while(s[j]<'' || s[j]>'') ++j;
while(s[j]>='' && s[j]<='')
m = (m << ) + (m << ) + s[j] - , ++j;
while(m--) {
if(s[] == 'L') q.pop_front();
else q.pop_back();
}
} }
deque<int>::iterator it;
for(it=q.begin(); it!=q.end(); ++it)
printf("%d\n", *it);
}
P2952 [USACO09OPEN]牛线Cow Line
单调队列deque容器实现:
设一个数组a,可以修改某一个元素的值,求a中所有元素的最小(大)值
每次从头扫到尾的时间复杂度O(n2)太高了,st表虽然是O(1)查询但不支持修改
可以使用线段树O(n log2 n)来做但复杂度还是不够优秀,常数还大
单调队列登场了:
每次加入双端队列尾一个元素num时,从队尾将队列中所有比num大的元素都pop出去,再push_back(num)
这样就能实现单调队列了。
单调队列模板题:【洛谷】P1440 求m区间内的最小值
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<deque>
using namespace std; const int MAXN = + ; int n, m;
int a[MAXN];
deque<int> q; inline int read() {
int x=, f=; char ch=getchar();
while(ch<'' || ch>'') {
if(ch == '-') f = -;
ch = getchar();
}
while(ch>='' && ch<='')
x=(x<<)+(x<<)+ch-, ch=getchar();
return x * f;
} int main() {
n = read(), m = read();
for(int i=; i<=n; ++i) a[i] = read();
puts("");
for(int i=; i<n; ++i) {
if(i>m && q.front()==a[i-m]) q.pop_front();
while(!q.empty() && q.back()>a[i]) q.pop_back();
q.push_back(a[i]);
printf("%d\n", q.front());
}
}
P1440 求m区间内的最小值
单调队列优化DP:
在用单调队列优化DP的时候,每次除维护序列的单调性外,还需要把队首已经没有用的元素pop_front()掉
能够用单调队列优化的DP一般都长成这个样子:
f[i] = max/min{f[k]} + ...
1 ≤ k < i
而优化的其实是求最值的过程:将O(n)优化到了O(1).
【模板】deque实现单调队列的更多相关文章
- POJ 2823 Sliding Window (模板题)【单调队列】
<题目链接> <转载于>>> > 题目大意: 给你一段序列和一个长为k的窗口,这个窗口从最左边逐渐向右滑,直到滑到最右边,问你,该窗口在滑动的过程中,最大值和 ...
- 题解【洛谷P1886】滑动窗口 /【模板】单调队列
题面 单调队列模板题. 单调队列可以从队首和队尾出队. 队列中的元素大小具有一定的顺序. 具体可参考这一篇题解 #include <bits/stdc++.h> #define itn i ...
- P1886 P2216 单调队列模板
何为单调队列? 单调队列是一个队列(废话) 而且必须同时满足下标单调和值单调两个单调特性. 跟优先队列不同,优先队列直接使用堆(heap)来实现,如何删去特定下标元素?不明. 本人喜欢用单调队列存下标 ...
- 计蒜客 A2232.程序设计:蒜厂年会-单调队列(双端队列(STL deque)实现)滑窗维护最小前缀和
程序设计:蒜厂年会 问答问题反馈 只看题面 16.79% 1000ms 262144K 在蒜厂年会上有一个抽奖,在一个环形的桌子上,有 nn 个纸团,每个纸团上写一个数字,表示你可以获得多少蒜币. ...
- BZOJ 2096 Pilots - 单调队列STL(deque)
传送门 分析: 单调队列:维护两个递增.递减的队列,每次都加入新元素并更新,如果最大值(递减队首)-最小值(递增队首) > k,那么将最左段更新为前面两者中较前的那一个,并弹掉.用deque可以 ...
- luoguP1886 滑动窗口(单调队列模板题)
题目链接:https://www.luogu.org/problem/P1886#submit 题意:给定n个数,求大小为k的滑动窗口中最小值和最大值. 思路:单调队列模板题. AC代码: #incl ...
- Sliding Window POJ - 2823 单调队列模板题
Sliding Window POJ - 2823 单调队列模板题 题意 给出一个数列 并且给出一个数m 问每个连续的m中的最小\最大值是多少,并输出 思路 使用单调队列来写,拿最小值来举例 要求区间 ...
- P1886 滑动窗口 /【模板】单调队列 方法记录
原题链接 滑动窗口 /[模板]单调队列 题目描述 有一个长为 \(n\) 的序列 \(a\),以及一个大小为 \(k\) 的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最 ...
- 模板 RMQ问题ST表实现/单调队列
RMQ (Range Minimum/Maximum Query)问题是指: 对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,R ...
随机推荐
- 【原】Spring activiti 环境搭建之数据库创建
由于在开发工作流的时候,避免不了要保存一些数据和流程走向;所以在搭建Spring activiti开发环境的时候需要把官方提供的23张表创建到我们的DB,后续的流程都会在这些表中记录. 1.创建代码如 ...
- Form表单和里边的小部件
一.Form表单:form表单是用来收集用户信息,并向后台提交信息的区域表单: 1.属性 “action” 是 “行为“的意思,该属性的值表示:用户提交信息到哪个页面: 2.属性”method“ 是” ...
- c#之new关键词——隐藏基类方法
当从基类继承了一个(非抽象成员时),也就继承了父类的实现代码.如果是virtual成员,可以override:另外一种方法也能隐藏父类的实现代码(虚成员和非虚成员都可使用):定义与父类相同的方法名,加 ...
- QT5.4.2静态编译(包含QtWebKit),在VS2013上创建项目,并成功运行
Qt项目发布的exe程序,默认是以动态链接形式的,这样发布后的程序会附带好多Qt自己的dll库,这样文件数量不仅多,而且移植到其他电脑上的时候,还可能会遇到,提示缺其他库等各种运行不起 ...
- UNIX 系统调用:dup,dup2实现重定向
重定向一般在命令行里就是把原本输出到屏幕的数据转而输出到一个指定的文件当中.如 $ pwd > workdir.txt 此时workdir.txt内就存储了pwd命令的输出,当前所在的工作目录 ...
- ajax获取富文本数据无法正常渲染到页面问题
有时候富文本渲染到页面的时候 会连带标签一起渲染出来. 解决办法: 首先引用 <script src="https://cdn.jsdelivr.net/npm/fuwenben ...
- iTem2 保持连接,解决ssh的"Write failed: Broken pipe"问题
方法一: profiles -> sessions -> When idel, send ASCII code 问题场景 服务器环境:阿里云 Linux CentOS 主机 客户端:Mac ...
- 2017年5月22日 HTML基础知识(一)
一.Html 结构 1.1.HTML基本文档格式—<html> 标记 —<html>文档的头部好和主体内容 </html> 根标记 —<head> 文 ...
- 【java错误】System.out.println()出错
今天想测试java的System的类,没想到居然出错了.在同一个包下的java文件System全错,而其他包中的System没错.上网查了下资料,原来我是重定义了System类,覆盖了原来的Syste ...
- 网络I/O模型--01阻塞模式(普通)
很长一段时间内,大多数网络通信方式都是阻塞模式,即: · 客户端 向服务器端发出请求后,客户端会一直处于等待状态(不会再做其他事情),直到服务器端返回结果或者网络出现问题 . · 服务器端同样如此,当 ...