首页 > 其他分享 >单调栈

单调栈

时间:2023-01-15 18:55:18浏览次数:56  
标签:int tt 个数 ++ hh 单调

单调栈和单调队列通常的做法,用栈或者队列来存储元素,用栈和队列来考虑暴力的模拟方法,然后观察栈和队列里面的元素,看看是否有一些元素完全没用,把这些元素删掉,看看剩余元素是否有单调性,有单调性就可以看看题义,做出来了。

单调栈:

求一个数列中比第i个数小且最近的数

 原数组a[i]                                                                    3  4   2  7  5

第i个比a[i]小且最近的的数(从第i个数开始往左数) -1  3  -1  2  2

  1. #include <iostream>  
  2. using namespace std;  
  3. const int N=10010;  
  4. int n;  
  5. int stk[N],tt;  
  6. int main()  
  7. {  
  8.     ios_base::sync_with_stdio(0);  
  9.     cin.tie(0);  
  10.     cout.tie(0);  
  11.     cin>>n;  
  12.     for(int i=0;i<n;i++){  
  13.         int x;  
  14.         cin>>x;  
  15.         while(tt&&stk[tt]>=x)tt--;  
  16.         if(tt)cout<<stk[tt]<<" ";  
  17.         else cout<<-1<<" ";  
  18.         stk[++tt]=x;  
  19.     }  
  20.     return 0;  
  21.  }   

单调队列:

acwing 滑动窗口

154. 滑动窗口 - AcWing题库

 

  1. #include <iostream>  
  2. using namespace std;  
  3. const int N=1000010;  
  4. int n,k;  
  5. int a[N],q[N];  
  6. int main()  
  7. {  
  8.     scanf("%d%d",&n,&k);  
  9.     for(int i=0;i<n;i++)scanf("%d",&a[i]);  
  10.     int hh=0,tt=-1;  
  11.     for(int i=0;i<n;i++){  
  12.         //hh<=tt队列不为空,负责队列为空   
  13.         //判断队头是否已经滑出窗口  
  14.         if(hh<=tt&&i-k+1>q[hh])hh++;  
  15.         //判断新加的数是否会让前面的数删除  
  16.         while(hh<=tt&&a[q[tt]]>=a[i]) tt--;  
  17.         q[++tt]=i;  
  18.         //当不够k个数的话不输出,够了k个数才输出   
  19.         if(i>=k-1)printf("%d ",a[q[hh]]);  
  20.     }  
  21.     puts(" ");  
  22.     hh=0,tt=-1;  
  23.     for(int i=0;i<n;i++){  
  24.         //hh<=tt队列不为空,负责队列为空   
  25.         //判断队头是否已经滑出窗口  
  26.         if(hh<=tt&&i-k+1>q[hh])hh++;  
  27.         //判断新加的数是否会让前面的数删除  
  28.         while(hh<=tt&&a[q[tt]]<=a[i]) tt--;  
  29.         q[++tt]=i;  
  30.         //当不够k个数的话不输出,够了k个数才输出   
  31.         if(i>=k-1)printf("%d ",a[q[hh]]);  
  32.     }  
  33.     puts(" ");  
  34.     return 0;  
  35. }  

标签:int,tt,个数,++,hh,单调
From: https://www.cnblogs.com/saulgoodman1/p/17053951.html

相关文章

  • P1886 滑动窗口 /【模板】单调队列
    滑动窗口/【模板】单调队列题目描述有一个长为\(n\)的序列\(a\),以及一个大小为\(k\)的窗口。现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的......
  • 单调栈与单调队列
    目录单调栈单调队列栈与队列基础:https://www.cnblogs.com/hellohebin/p/16920864.html单调栈例题洛谷P5788【模板】单调栈洛谷P1901发射站单调队列例题洛谷......
  • 单调队列优化DP
    今天学习了单调队列优化DP,其模型为:\[f_i=\min/\max_{L(i)\lej\leR(i)}\lbracekf_j+val(i,j)\rbrace\]其中\(L,R\)是具有单调性的函数,\(val(i,j)=h_1(i)+h_2(j)\),是分......
  • 基于单调性的 dp 优化
    决策单调性决策单调性一般用于最优性问题当中,即一个状态只能从一个最优的状态转移,该最优状态称之为最优点。决策单调性就是指最优点随dp转移单调移动。一般如果能够将......
  • 23寒假集训二1月3号(单调队列+倍增)
    vjudge上面的题当天是我负责讲题所以写了一下博客,优先队列永远的敌人,一直没太整清楚前置知识倍增//倍增//给定一个数列,共有n个正数,现在有m次询问,每次询问给出一个t,求满......
  • 单调队列
    单调队列前言图床在\(Github\)中,如果访问不了\(Github\),则图片无法加载引入原题链接:P1886滑动窗口/【模板】单调队列-洛谷题意简述:有一个长度为\(n\)的数......
  • 单调队列优化的DP问题
    单调队列优化的DP问题概述单调队列就是通过排除求最值时候的冗余,从而是队列具有性质,可以方便求解问题。DP的两个阶段:朴素DP的基本原理——闫氏DP分析法对朴素DP进行......
  • 打破冬季单调 柯罗芭KLOVA在东方美学和摩登时尚间找寻平衡
    在衣着厚重的冬日,为了御寒舍弃了很多“漂亮的衣服”,但智慧的女人总能在保暖之余还留有一隅浪漫,放大服装的力量,展示个人魅力。随着冬季衣橱换新,柯罗芭KLOVA带来诚意......
  • Codeforces 1373 D. Maximum Sum on Even Positions 做题记录(单调队列)
    因为只能转一个子数组,很显然转长度为奇数的子数组,对最大化答案是没有意义的(偶数位的数字之和不会变化)。因此只考虑转偶长度的子数组。转动偶数长度的子数组,相当于......
  • 单调栈和单调队列
    《单调栈》#include<iostream>#include<cstring>#include<algorithm>#include<stack>usingnamespacestd;constintN=3*1e6+2;intn;structnode{......