4.queue

queue就是队列,平时用得非常多。栈的操作是只能是先进先出,与栈不同,是先进后出,与之后的deque也有区别。个人感觉手写队列有点麻烦,有什么head和tail什么的,所以说 STL大法好!!!

queue的定义

  1. #include<queue>
  2. using namespace std;
  3. queue<typename> a;
  4. queue<int> a;
  5. queue<string> a;
  6. 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的定义

  1. #include<deque>
  2. using namespace std;
  3. deque<typename> a;
  4. deque<int> a;
  5. deque<string> a;
  6. 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 这个长度范围内,如果不是在,记得弹出(注意判空),这样之后,输出队首元素就可以了。至于最大值的情况,把上面的比较换为 > 就可以了

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n,k;
  4. int a[1000005];
  5. deque<int> q;
  6. int main(){
  7. scanf("%d%d",&n,&k);
  8. for(register int i=1;i<=n;i++) scanf("%d",&a[i]);
  9. for(register int i=1;i<=n;i++){
  10. while(!q.empty()&&a[q.back()]>a[i]) q.pop_back();
  11. q.push_back(i);
  12. if(i>=k){
  13. while(!q.empty()&&q.front()<=i-k) q.pop_front();
  14. printf("%d ",a[q.front()]);
  15. }
  16. }
  17. while(!q.empty()) q.pop_back();
  18. puts("");
  19. for(register int i=1;i<=n;i++){
  20. while(!q.empty()&&a[q.back()]<a[i]) q.pop_back();
  21. q.push_back(i);
  22. if(i>=k){
  23. while(!q.empty()&&q.front()<=i-k) q.pop_front();
  24. printf("%d ",a[q.front()]);
  25. }
  26. }
  27. return 0;
  28. }

P1714 切蛋糕,一道单调队列的稍微多动点脑筋的题。因为连续吃 k 个蛋糕,我直接打了一个前缀和+暴力枚举看看能得多少分,用前缀和是为了统计区间的值,也方便计算区间内的幸运值。还是不错的,有40分(吸氧也救不了我),继续想单调队列

其实同之前的滑动窗口一样,因为我们要连续吃 k 块蛋糕,求区间的最大值,前缀和还是需要用到的,我们只需要将上面滑动窗口中的比较元素改为比较前缀和就行了,代码和上面基本相同

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n,m;
  4. int sum[550005];
  5. deque<int> q;
  6. int main(){
  7. scanf("%d%d",&n,&m);
  8. for(register int i=1;i<=n;i++){
  9. int x;
  10. scanf("%d",&x);
  11. sum[i]=sum[i-1]+x;
  12. }
  13. int ans=-99999999;
  14. for(register int i=1;i<=n;i++){
  15. while(!q.empty()&&sum[q.back()]>=sum[i]) q.pop_back();
  16. q.push_back(i);
  17. while(!q.empty()&&q.front()<=i-m) q.pop_front();
  18. ans=max(ans,sum[i]-sum[q.front()]);
  19. }
  20. cout<<ans;
  21. return 0;
  22. }

STL初步学习(queue,deque)的更多相关文章

  1. stl容器学习——queue,stack,list与string

    目录 头文件 string 目录部分 1.string的定义及初始化 ① 用一个字符串给另一个字符串赋值 ②用字符串常量对字符串进行赋值 ③ 用n个相同的字符对字符串赋值 2.string的运算符及比 ...

  2. AcWing STL初步学习

    vector, 变长数组,倍增的思想 size() 返回元素个数 empty() 返回是否为空 clear() 清空 front()/back() push_back()/pop_back() beg ...

  3. STL初步学习(vector)

    前文 初三下学期进入新的学习,对于前两年的学习内容因为各种原因 上课打游戏,睡觉,看视频 已经遗忘,忘记如何使用,算是重新学习一次信息学,希望能尽快将以前的内容弥补上来,争取能在CSP-2020取得一 ...

  4. C++ STL 源代码学习(之deque篇)

    stl_deque.h /** Class invariants: * For any nonsingular iterator i: * i.node is the address of an el ...

  5. STL初步学习(set)

    2.set set可以看作一个集合,可以实现自动排序(升序)和去重 在许多题目中,都可以使用这个模板库,减少很多操作,例如P1923 第k小数,当然,这道题有很多奇奇怪怪的做法,分值都不同,之后会讲解 ...

  6. STL初步学习(map)

    3.map map作为一个映射,有两个参数,第一个参数作为关键值,第二个参数为对应的值,关键值是唯一的 在平时使用的数组中,也有点类似于映射的方法,例如a[10]=1,但其实我们的关键值和对应的值只能 ...

  7. C++标准模板类库(STL)之queue初步

    1,STL里有些什么? 包括三个内容:容器.迭代器.算法. 2,容器有哪些? 有stack, vector, queue, deque, list, set, multiset, map, multi ...

  8. json2.js的初步学习与了解

    json2.js的初步学习与了解,想要学习json的朋友可以参考下. json2.js的初步学习与了解 1.)该js的下载地址是:http://www.json.org/json2.js 2.)在页面 ...

  9. 老周的ABP框架系列教程 -》 一、框架理论初步学习

    老周的ABP框架系列教程 -- 一.框架理论初步学习   1. ABP框架的来源与作用简介 1.1  简介 1.1.1       ABP框架全称为"ASP.NET Boilerplate ...

随机推荐

  1. 纯正中文版本pi-star系统下载

    基于3.4.17修改(稳定,发热量少) 不支持RPI 4 a/b+ 完美支持树莓派0,1,2,3 默认刷好卡,启动已经设置好所有参数(选好TFT屏幕,调制解调器类型GPIO,打开了DMR服务器(460 ...

  2. Linux磁盘空间容量不够-通过新增磁盘-挂载原磁盘

    首先上一张图 -------1)首先fdisk 一块磁盘并格式化 mkfs.ext4 /dev/sda15 --------2)将此磁盘挂载在mnt目录下,并将磁盘容量不够的磁盘所有文件进行复制到mn ...

  3. 环境篇:CM+CDH6.3.2环境搭建(全网最全)

    环境篇:CM+CDH6.3.2环境搭建(全网最全) 一 环境准备 1.1 三台虚拟机准备 Master( 32g内存 + 100g硬盘 + 4cpu + 每个cpu2核) 2台Slave( 12g内存 ...

  4. 心有 netty 一点通!

    一.标准的netty线程模型 双池合璧: 1.连接线程池: 连接线程池专门负责监听客户端连接请求,并完成连接的建立(包括诸如握手.安全认证等过程). 连接的建立本身是一个极其复杂.损耗性能的过程,此处 ...

  5. lei muban

    #include<iostream> using namespace std; template <typename T> class Operator{ public: T ...

  6. Pycharm下安装Numpy包

    Numpy--Numerical Python,是一个基于Python的可以存储和处理大型矩阵的库.几乎是Python 生态系统的数值计算的基石,例如Scipy,Pandas,Scikit-learn ...

  7. WEditor(元素定位工具)安装和定位界面元素

     1. 安装adb(安装方法——百度网盘(无邪)) 2. 安装python-uiautomator2 pip install --pre -U uiautomator2 3. 手机设备安装atx-ag ...

  8. mapper.xml文件映射配置

    一.导入约束 为全局配置文件绑定dtd约束: 1)联网会自动绑定 2)没网的时候[/org/apache/ibatis/builder/xml/mybatis-3-mapper.dtd]:解压myba ...

  9. WeChair——团队展示

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 团队名称 WeChair 这个作业要求在哪里 团队作业第一次 这个作业的目标 团队合作,项目开发 作业正文 如下 其他参考文献 ...

  10. .NET Core Hangfire周期性作业调度问题

    前言 四月中旬Hangfire团队发布了1.7.11版本,在使用周期性作业调度过程中发现一个问题,这个问题应该一直未解决,故做此记录,希望遇到的童鞋根据项目业务而避开这个问题. 周期性作业调度 我们依 ...