【模板】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 ...
随机推荐
- 二:Jquery-action
一:dom对象和jq对象 1.对象含义: dom对象:js方法获取元素,将dom对象存储在变量中 jq对象:jq方法获取元素的jq对象,将jq对象存储在变量中 相互之间不能使用另外一个对象的任何属性和 ...
- 概述Java集合框架
JAVA集合框架主要分为三个部分:接口,实现和算法.接口是指以Collection和Map为起始的一系列公用接口,其中还有Vector接口,也就是迭代器,Collection接口下面又有List 和S ...
- servlet(一):从Sevlet到HttpServlet
Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层. servlet ...
- 哈夫曼编码(Huffman coding)的那些事,(编码技术介绍和程序实现)
前言 哈夫曼编码(Huffman coding)是一种可变长的前缀码.哈夫曼编码使用的算法是David A. Huffman还是在MIT的学生时提出的,并且在1952年发表了名为<A Metho ...
- 15、springboot访问html文件
在pom.xml加入 <parent> <groupId>org.springframework.boot</groupId> <artifactId> ...
- js 中的console.log有什么作用
主要是方便你调式javascript用的.你可以看到你在页面中输出的内容. 相比alert他的优点是: 他能看到结构话的东西,如果是alert,淡出一个对象就是[object object],但是co ...
- [转]关于浏览器css选择器性能优化
作为一个前端开发, 我觉得很有必要了解浏览器对css选择器的解析,因为这个关系到页面的渲染,高效的方式.避开开销大的方式这些无疑为网站加载缩短了时间. 最近在新的项目中陷入了一个误区,也是出于对jqu ...
- javascript之for循环的几种写法
背景 javascript中的for循环选择多种多样,可你知道其中的差别在哪里吗?什么时候又该用哪种循环才是最佳策略?以上这些是本文想讨论的,欢迎交流. 说明 1.20年前的for循环 //20年前的 ...
- IIS 部署 Python Django网站流程(受够了野路子)
知道的,百度上搜出来的东西质量令人唏嘘.当你求助的时候多半还得靠自己,或者靠Google 介入正题,详细来一遍流程吧 当然,我是用Visual Studio 2019 来编辑开发Django项目的,如 ...
- c# 后台异步请求接口
第一步:引用程序集:Systen.Net.Http 第一种方式: 异步 Get请求 HttpClient client = new HttpClient(); //client. ...