STL初步学习(queue,deque)
4.queue
queue就是队列,平时用得非常多。栈的操作是只能是先进先出,与栈不同,是先进后出,与之后的deque也有区别。个人感觉手写队列有点麻烦,有什么head和tail什么的,所以说 STL大法好!!!
queue的定义
#include<queue>
using namespace std;
queue<typename> a;
queue<int> a;
queue<string> a;
queue<node> a;
queue这个东西没有遍历,主要讲函数
①push(),push(x)将 x 入队,时间复杂度为O(1),
②front(),back(),分别为访问队首和队尾元素,时间复杂度为O(1)
③pop(),将队首元素出队,时间复杂度为O(1)
④empty(),检测队列是否为空,空则返回true,非空则返回false,时间复杂度为O(1)
⑤size(),返回队列中元素个数,时间复杂度为O(1)
时间复杂度全为O(1),舒服啊
因为queue的主要运用感觉不会涉及到很多题目(是我孤陋寡闻),主要是在广度优先搜索时,自己手写队列的话,可能会导致一些错误,用STL的话可以提高一些程序正确率吧。但是在使用时一定要注意,关于queue,包括其他一些stack之类的,使用前一定要注意empty的判断
至于一些好的题目,我也没找到什么。。就做一做广搜的题吧
5.deque
deque为双端队列,与queue不同的是,deque可以任意地调用和弹出队首和队尾元素,queue只能弹出队首元素
deque的定义
#include<deque>
using namespace std;
deque<typename> a;
deque<int> a;
deque<string> a;
deque<node> a;
同queue一样,这玩意没有遍历(函数的话,我自己不大清楚,应该时间复杂度也都是O(1)吧)
①front(),返回队首元素;back(),返回队尾元素
②pop_front(),删除队首元素;pop_back(),删除队尾元素
③push_front(x),将元素x加入到队首;push_back(x),将元素x加入到队尾
关于deque的应用,最经典的就是对于单调队列。单调队列中的元素为递增和递减,并且队列中的元素与序列中的元素顺序应该一致,并且能从队首和队尾加入(删除)元素
经典例题
P1886 滑动窗口,单调队列的模板题,如果实力足够的大佬 应该除了我都行 可以尝试用线段树,树状数组,ST表之类的过这一道题
以最小值为例。从1开始枚举到n,如果当前的元素满足a[ i ] <= a[ q.back()] (注意,优先队列中存储的是下标,而不是对应的元素的值),那么我们将优先队列中的队尾元素弹出,这样做是为了维护这个优先队列事从小到大的,然后将当前的 i 推入队列中
这样只会,当 i >= k 时,就开始输出答案了。在输出之前,先判断当前的队首元素是否在 k 这个长度范围内,如果不是在,记得弹出(注意判空),这样之后,输出队首元素就可以了。至于最大值的情况,把上面的比较换为 > 就可以了
#include<bits/stdc++.h>
using namespace std;
int n,k;
int a[1000005];
deque<int> q;
int main(){
scanf("%d%d",&n,&k);
for(register int i=1;i<=n;i++) scanf("%d",&a[i]);
for(register int i=1;i<=n;i++){
while(!q.empty()&&a[q.back()]>a[i]) q.pop_back();
q.push_back(i);
if(i>=k){
while(!q.empty()&&q.front()<=i-k) q.pop_front();
printf("%d ",a[q.front()]);
}
}
while(!q.empty()) q.pop_back();
puts("");
for(register int i=1;i<=n;i++){
while(!q.empty()&&a[q.back()]<a[i]) q.pop_back();
q.push_back(i);
if(i>=k){
while(!q.empty()&&q.front()<=i-k) q.pop_front();
printf("%d ",a[q.front()]);
}
}
return 0;
}
P1714 切蛋糕,一道单调队列的稍微多动点脑筋的题。因为连续吃 k 个蛋糕,我直接打了一个前缀和+暴力枚举看看能得多少分,用前缀和是为了统计区间的值,也方便计算区间内的幸运值。还是不错的,有40分(吸氧也救不了我),继续想单调队列
其实同之前的滑动窗口一样,因为我们要连续吃 k 块蛋糕,求区间的最大值,前缀和还是需要用到的,我们只需要将上面滑动窗口中的比较元素改为比较前缀和就行了,代码和上面基本相同
#include<bits/stdc++.h>
using namespace std;
int n,m;
int sum[550005];
deque<int> q;
int main(){
scanf("%d%d",&n,&m);
for(register int i=1;i<=n;i++){
int x;
scanf("%d",&x);
sum[i]=sum[i-1]+x;
}
int ans=-99999999;
for(register int i=1;i<=n;i++){
while(!q.empty()&&sum[q.back()]>=sum[i]) q.pop_back();
q.push_back(i);
while(!q.empty()&&q.front()<=i-m) q.pop_front();
ans=max(ans,sum[i]-sum[q.front()]);
}
cout<<ans;
return 0;
}
STL初步学习(queue,deque)的更多相关文章
- stl容器学习——queue,stack,list与string
目录 头文件 string 目录部分 1.string的定义及初始化 ① 用一个字符串给另一个字符串赋值 ②用字符串常量对字符串进行赋值 ③ 用n个相同的字符对字符串赋值 2.string的运算符及比 ...
- AcWing STL初步学习
vector, 变长数组,倍增的思想 size() 返回元素个数 empty() 返回是否为空 clear() 清空 front()/back() push_back()/pop_back() beg ...
- STL初步学习(vector)
前文 初三下学期进入新的学习,对于前两年的学习内容因为各种原因 上课打游戏,睡觉,看视频 已经遗忘,忘记如何使用,算是重新学习一次信息学,希望能尽快将以前的内容弥补上来,争取能在CSP-2020取得一 ...
- C++ STL 源代码学习(之deque篇)
stl_deque.h /** Class invariants: * For any nonsingular iterator i: * i.node is the address of an el ...
- STL初步学习(set)
2.set set可以看作一个集合,可以实现自动排序(升序)和去重 在许多题目中,都可以使用这个模板库,减少很多操作,例如P1923 第k小数,当然,这道题有很多奇奇怪怪的做法,分值都不同,之后会讲解 ...
- STL初步学习(map)
3.map map作为一个映射,有两个参数,第一个参数作为关键值,第二个参数为对应的值,关键值是唯一的 在平时使用的数组中,也有点类似于映射的方法,例如a[10]=1,但其实我们的关键值和对应的值只能 ...
- C++标准模板类库(STL)之queue初步
1,STL里有些什么? 包括三个内容:容器.迭代器.算法. 2,容器有哪些? 有stack, vector, queue, deque, list, set, multiset, map, multi ...
- json2.js的初步学习与了解
json2.js的初步学习与了解,想要学习json的朋友可以参考下. json2.js的初步学习与了解 1.)该js的下载地址是:http://www.json.org/json2.js 2.)在页面 ...
- 老周的ABP框架系列教程 -》 一、框架理论初步学习
老周的ABP框架系列教程 -- 一.框架理论初步学习 1. ABP框架的来源与作用简介 1.1 简介 1.1.1 ABP框架全称为"ASP.NET Boilerplate ...
随机推荐
- Java实现 LeetCode 443 压缩字符串
443. 压缩字符串 给定一组字符,使用原地算法将其压缩. 压缩后的长度必须始终小于或等于原数组长度. 数组的每个元素应该是长度为1 的字符(不是 int 整数类型). 在完成原地修改输入数组后,返回 ...
- Java实现 LeetCode 329 矩阵中的最长递增路径
329. 矩阵中的最长递增路径 给定一个整数矩阵,找出最长递增路径的长度. 对于每个单元格,你可以往上,下,左,右四个方向移动. 你不能在对角线方向上移动或移动到边界外(即不允许环绕). 示例 1: ...
- Java实现N*N矩阵旋转(360度)
N*N矩阵旋转 Description 给你一个n*n的矩阵,你的任务是将它逆时针旋转角度d. [输入] 输入的第一个数为T,表示接下来有T组数据. 每组数据的格式如下: 第一行为两个整数n,d.1& ...
- Java实现 蓝桥杯VIP 算法提高 最长字符序列
算法提高 最长字符序列 时间限制:1.0s 内存限制:256.0MB 最长字符序列 问题描述 设x(i), y(i), z(i)表示单个字符,则X={x(1)x(2)--x(m)},Y={y(1)y( ...
- Java实现 LeetCode 73 矩阵置零
73. 矩阵置零 给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0.请使用原地算法. 示例 1: 输入: [ [1,1,1], [1,0,1], [1,1,1] ...
- java实现 蓝桥杯 算法训练 Password Suspects
问题描述 在年轻的时候,我们故事中的英雄--国王 Copa--他的私人数据并不是完全安全地隐蔽.对他来说是,这不可接受的.因此,他发明了一种密码,好记又难以破解.后来,他才知道这种密码是一个长度为奇数 ...
- Java实现 蓝桥杯 历届试题 带分数
问题描述 100 可以表示为带分数的形式:100 = 3 + 69258 / 714. 还可以表示为:100 = 82 + 3546 / 197. 注意特征:带分数中,数字1~9分别出现且只出现一次( ...
- 哪些年,我们玩过的Git
作者:玩世不恭的Coder公众号:玩世不恭的Coder时间:2020-06-05说明:本文为原创文章,未经允许不可转载,转载前请联系作者 哪些年,我们玩过的Git 前言一.前期工作常用基本概念的理解G ...
- SaaS权限设计总结
2年前转到SaaS部门之后期间断断续续做着权限相关的业务,这篇文章主要回顾下过往的设计以及其原因和利弊. 不过因为是线上业务,会省略掉很多细节以及账号体系和权益相关得部分,只讨论权限相关. 本文也不会 ...
- CenterOS7 修改 SSH 端口
首先修改 /etc/ssh/sshd_config 文件中的 Port.修改前一定要备份 可以同时启用多个Port所以最好先追加一个端口,新端口校验没问题之后再把原端口删除 防火墙设置 # 永久开放端 ...