首页 > 其他分享 >单调栈板子

单调栈板子

时间:2025-01-10 19:55:51浏览次数:1  
标签:arr cur int 元素 st ans 板子 单调

单调栈

用于求解数组每个位置上左边/右边离自己最近的且严格小于/大于自己位置上的数位置
时间复杂度O(N)(每个元素下标进栈一次出栈一次)
元素下标能表示的含义比元素本身要多
(ps:注意数组长度,过大就要开到全局变量中,否则异常退出orz)

方法(求每个位置上离自己最近且严格小于自己的元素位置(严格大压小)),允许有重复值

int ans[maxn][2];//用来存放每个位置上左答案和右答案
int st[maxn];//用数组模拟栈
void compute(int arr[])
{
    int r=0;
    int cur;
    //遍历阶段
    for(int i=0;i<n;i++)
    {
        while(r>0&&arr[st[r-1]]>=arr[i])//栈顶元素大于或等于要进栈的元素
        {
            cur=st[--r];//栈顶元素的index
            ans[cur][0]= r>0 ? st[r-1]:-1;(如果下面没压下标,就返回-1当作不存在)
            ans[cur][1]=i;(如果栈顶元素大于要进栈的元素,此答案为真。否则,先记录下来,再修正)
        }
        st[r++]=i;//元素下标进栈
    }
    //清算阶段
    while(r>0)//当栈里还有元素下标时
    {
        cur=st[--r];
        ans[cur][0]= r>0?st[r-1]:-1;
        ans[cur][1]=-1;//右边没有
    }
    //修正阶段
    for(int i=n-2;i>=0;i--)//从右往左修正(n-1位置元素右侧一定是-1,无需验证)
    {
        if(ans[i][1]!=-1&&arr[ans[i][1]]==arr[i])//只需验证右答案正确性(如果i位置元素==右答案记录的元素,就把i位置右答案“右移动”)
        {
            ans[i][1]=ans[ans[i][1]][1];
        }
    }
}

标签:arr,cur,int,元素,st,ans,板子,单调
From: https://www.cnblogs.com/benscode/p/18664571

相关文章

  • Codeforces 319B Psychos in a Line 题解 [ 绿 ] [ 单调栈 ] [ 动态规划 ] [ adhoc ]
    PsychosinaLine:很好的单调栈优化dp题!观察我们先观察,一个精神病人会一直杀到什么时候。显然,会杀到右边第一个比他大的精神病人那里,然后他就杀不动了。因此我们可以从右往左考虑,算出左边的精神病人杀掉这个精神病人后左边的人的答案是什么。假设左边的人目前已经刀了\(x\)......
  • 柱状图中最大的矩形(单调递增栈)
    给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为1。求在该柱状图中,能够勾勒出来的矩形的最大面积。示例1:输入:heights=[2,1,5,6,2,3]输出:10解释:最大的矩形为图中红色区域,面积为10示例2:输入:heights=[2,4]输出:4代码思想:进栈......
  • 每日温度(单调递增栈)
    给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。 示例1:输入:temperatures=[73,74,75,71,69,72,76,73]输出: [1,1,4,2,1,1......
  • 板子
    板子合集头文件//5oiR5piv6YKj57u06I6x54m555qE54uX#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;typedefunsignedlonglongull;constexprintN=-1;constexprintinf=20241218;stack<char>t;intmain(){// freopen("neuvill......
  • 006. 滑动窗口 /【模板】单调队列(洛谷P1886)
    006.滑动窗口/【模板】单调队列(洛谷P1886)题目描述有一个长为\(n\)的序列\(a\),以及一个大小为\(k\)的窗口。现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值。例如,对于序列\([1,3,-1,-3,5,3,6,7]\)以及\(k=3\),有如下过程:\[\def\a......
  • 单调栈
    [Algo]单调栈基本模板:vector<vector<int>>lessThanIndex(vector<int>&arr){intlen=arr.size();vector<vector<int>>ans(len,vector<int>(2,0));stack<int>s;for(inti=0;i<len;i++)......
  • JVM内存模型、垃圾回收机制及简单调优方式
    JVM内存模型:1.方法区  用来存放类加载的信息,同时存放静态属性和方法(静态方法和普通方法)  jdk1.7之后,取消了方法区名称,改为元空间、方法区也叫元空间也叫永久区  方法区中的数据,可以被多线程共享。访问时会有数据共享的安全问题2.堆区  用来存放对象或数......
  • 快速幂板子
    目录前言板子结语前言        无板子        注:如果不取模,就直接去掉mod,计算式中的mod也去掉longlongpowerfast(){longlonga,b,mod=1000000007,result=1;cin>>a>>b;a=a%mod;while(b>0){if(b%2!=0){r......
  • 【多维DP】【准NOI难度】力扣3251. 单调数组对的数目 II
    给你一个长度为n的正整数数组nums。如果两个非负整数数组(arr1,arr2)满足以下条件,我们称它们是单调数组对:两个数组的长度都是n。arr1是单调非递减的,换句话说arr1[0]<=arr1[1]<=…<=arr1[n-1]。arr2是单调非递增的,换句话说arr2[0]>=ar......
  • Luogu P8112 [Cnoi2021] 符文破译 题解 [ 蓝 ] [ KMP ] [ 线性 dp ] [ 决策单调性 dp
    符文破译:KMP+dp的好题。暴力dp不难打出一个暴力dp:设计\(dp_i\)表示当前前\(i\)位全部完成了匹配,所需的最小分割数。转移也是简单的,我们在KMP的过程中进行dp转移,每次选取next不断跳向再前面的next,然后进行转移即可。很显然一个字符集大小为\(1\)的串就能轻松......