单调队列 && 单调栈

单调队列

  • 维护某个滑动区间的min or max,可用于dp的优化
  • 以维护min为例,采用STL双端队列实现
  • 每次加入元素x前
  • 先检查队首元素==滑动后要删除的元素,如果是队收弹出
  • 同时将队尾>x的元素都弹出
  • 加入元素x,此时队收元素就是当前的Min
  • luogu1886
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define name2str(name) (#name)
  5. #define db(x) cout<<#x"=["<<(x)<<"]"<<endl
  6. #define CL(a,b) memset(a,b,sizeof(a))
  7. #define sf(a) scanf("%d",&a)
  8. #define pr(a) printf("%d\n",a)
  9. #define rng(a) a.begin(),a.end()
  10. #define pb push_back
  11. #define fast ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0)
  12. #define fr0(i,m) for(int i=0;i<m;i++)
  13. #define fr1(i,m) for(int i=1;i<=m;i++)
  14. //author:fridayfang
  15. //date:19 3月 02
  16. const double esp=1e-8;
  17. const int mod=1e9+7;
  18. const double pi=acos(-1);
  19. const int inf=0x3f3f3f3f;
  20. const int maxn = 1e6 + 5;
  21. const int maxm = 1e6+5;
  22. int a[maxn];
  23. int n,k;
  24. deque<int> q1;
  25. deque<int> q2;
  26. int main(){
  27. sf(n),sf(k);
  28. fr1(i,n) sf(a[i]);
  29. for(int i=1;i<=n;i++){
  30. if(!q2.empty()&&i>=k&&a[i-k]==q2.front()) q2.pop_front();
  31. while(!q2.empty()&&q2.back()>a[i]) q2.pop_back();
  32. q2.push_back(a[i]);
  33. if(i>=k) printf("%d ",q2.front());
  34. }
  35. printf("\n");
  36. for(int i=1;i<=n;i++){
  37. if(!q1.empty()&&i>=k&&a[i-k]==q1.front()) q1.pop_front();
  38. while(!q1.empty()&&q1.back()<a[i]) q1.pop_back();
  39. q1.push_back(a[i]);
  40. if(i>=k) printf("%d ",q1.front());
  41. }
  42. return 0;
  43. }

单调栈

  • 我们先考虑单调增栈,即要求栈底到栈顶元素依次递增
  • 如果加元素\(a[i]=x\)小于栈顶\(a[j]\)(栈只记录j值,下标),则不断弹出栈顶元素,每次弹出的元素at,则t右边第一个小于他的位置r[t]=i
  • 而i左边第一个小于它的位置l[i]stack.front()
  • leetcode42. Trapping Rain Water
  1. class Solution {
  2. public int trap(int[] height) {
  3. int res = 0;
  4. Stack<Integer> stack = new Stack<>();
  5. int i = 0;
  6. while (i < height.length) {
  7. if (stack.isEmpty() || height[i] < height[stack.peek()]) {
  8. stack.push(i++);
  9. } else {
  10. int bottom = stack.peek();
  11. stack.pop();
  12. if (stack.isEmpty()) continue;
  13. int leftBound = stack.peek();
  14. int rain = (Math.min(height[leftBound], height[i]) - height[bottom]) * (i - leftBound - 1);
  15. res += rain;
  16. }
  17. }
  18. return res;
  19. }
  20. }

单调队列 && 单调栈的更多相关文章

  1. 联赛模拟测试18 A. 施工 单调队列(栈)优化DP

    题目描述 分析 对于 \(Subtask\ 1\),可以写一个 \(n^3\) 的 \(DP\),\(f[i][j]\) 代表第 \(i\) 个建筑高度为 \(j\) 时的最小花费,随便转移即可 时间 ...

  2. 数据结构录 之 单调队列&单调栈。

    队列和栈是很常见的应用,大部分算法中都能见到他们的影子. 而单纯的队列和栈经常不能满足需求,所以需要一些很神奇的队列和栈的扩展. 其中最出名的应该是优先队列吧我觉得,然后还有两种比较小众的扩展就是单调 ...

  3. 单调队列&单调栈

    单调队列 例题: Poj 2823给定一个数列,从左至右输出每个长度为m的数列段内的最小数和最大数.数列长度:N<=106,m<=N 对于单调队列,我们这样子来定义: 1.维护区间最值 2 ...

  4. 数据结构录 之 单调队列&单调栈。(转)

    http://www.cnblogs.com/whywhy/p/5066306.html 队列和栈是很常见的应用,大部分算法中都能见到他们的影子. 而单纯的队列和栈经常不能满足需求,所以需要一些很神奇 ...

  5. 大视野 1012: [JSOI2008]最大数maxnumber(线段树/ 树状数组/ 单调队列/ 单调栈/ rmq)

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 9851  Solved: 4318[Submi ...

  6. 小Z爱序列(NOIP信(sang)心(bin)赛)From FallDream(粗制单调队列&单调栈的算法解析)

    原题: 小Z最擅长解决序列问题啦,什么最长公共上升然后下降然后上升的子序列,小Z都是轻松解决的呢. 但是小Z不擅长出序列问题啊,所以它给了你一道签到题. 给定一个n个数的序列ai,你要求出满足下述条件 ...

  7. POJ 3494 Largest Submatrix of All 1’s 单调队列||单调栈

    POJ 3494 Largest Submatrix of All 1’s Description Given a m-by-n (0,1)-matrix, of all its submatrice ...

  8. 单调队列&单调栈归纳

    单调队列 求长度为M的区间内的最大(小)值 单调队列的基本操作,也就是经典的滑动窗口问题. 求长度为M的区间内最大值和最小值的最大差值 两个单调队列,求出长度为M的区间最大最小值的数组,分别求最大最小 ...

  9. 【NOIP数据结构专项】单调队列单调栈

    [FZYZ P1280 ][NOIP福建夏令营]矩形覆盖 Description 有N个矩形,矩形的底边边长为1,且均在X轴上,高度给出,第i个矩形的高为h[i],求最少需要几个矩形才能覆盖这个图形. ...

随机推荐

  1. MYSQL 字符集 MYSQL 源码

    http://blog.csdn.net/maray/article/details/46504621

  2. MySql存储过程与函数

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:存储过程和函数是在数据库中定义一些SQL语句的集合,然后直接调用这些存储过程和函数来运行 ...

  3. @Validated数据校验

    //lastName必须是邮箱格式 @Email private String lastName;

  4. 卸载了 TortoiseGit,问题太多

    电脑里面同一时候安装TortoiseGit 和 TortoiseSVN,使用tortoiseGIT来跟踪git项目,有一个非常无语的问题,git status显示都是clean的.可是目录图标却始终显 ...

  5. vijos P1459车展

    P1459车展 Accepted 标签:数据结构 平衡树数据结构 堆重游SC theme Park     描述 遥控车是在是太漂亮了,韵韵的好朋友都想来参观,所以游乐园决定举办m次车展.车库里共有n ...

  6. oc34--instancetype和id的区别

    // Person.h #import <Foundation/Foundation.h> @interface Person : NSObject @property int age; ...

  7. codeforce1046 Bubble Cup 11 - Finals 题解

    比赛的时候开G开了3h结果rose说一句那唯一一个AC的是羊的心态就崩了.. 这套题感觉质量挺好然后就back了下 A: AI robots 有三个限制条件:相互能够看见和智商的差.使用主席树,可以维 ...

  8. SqlServer 自动备份策略设置

    企业管理器中的Tools,Database Maintenance Planner,可以设置数据库的定期自动备份计划.并通过启动Sql server Agent来自动运行备份计划.具体步骤如下: 1. ...

  9. mongodb 3.2配置内存缓存大小为MB/MongoDB 3.x内存限制配置

    mongodb 3.2配置内存缓存大小为MB/MongoDB 3.x内存限制配置 转载自勤奋的小青蛙 mongodb占用内存非常高,这是因为官方为了提升存储的效率,设计就这么设计的. 但是大部分的个人 ...

  10. 实现泛型IEnumerable接口

    用C#实现一个类的IEnumerable接口时有两种方法:1)实现非泛型IEnumerable接口:2)实现泛型IEnumerable(T)接口.如果采用方法1,当集合元素T是值类型时,将涉及到巨多的 ...