首页 > 其他分享 >单调栈

单调栈

时间:2023-06-30 10:00:16浏览次数:42  
标签:int sum solve maxm top 单调

目录

单调栈

单调的栈,即插入元素时保证栈内元素是有序的。

例题

  1. P2422 良好的感觉
    贪心,其实对每一个最小值,找到其的左右小于最大范围,但关键在于怎么快速找到这个范围,这里利用了单调栈
    详见代码:
const int maxm=1e5+5,inf=0x3f3f3f3f,mod=998244353;
ll n,a[maxm],sum[maxm],f[maxm];
stack<ll> m;

void solve(){
	cin>>n;
	ll ans=0;
	a[0]=0;
	for(int i=1;i<=n;++i){
		cin>>a[i];
	}
	a[++n]=0;//用于最后将所有清空
	for(int i=1;i<=n;++i){
		sum[i]=sum[i-1]+a[i];
		while(!m.empty()&&a[m.top()]>a[i]){
			f[m.top()]+=sum[i-1]-sum[m.top()];//统计到右边第一个小的
			m.pop();
		}
		if(!m.empty())//统计到左边第一个小的
			f[i]+=sum[i]-sum[m.top()];
		else f[i]+=sum[i];
		m.push(i);
	}
	for(int i=1;i<=n;++i)
		ans=max(ans,f[i]*a[i]);//计算每个点作为最小时的结果
	cout<<ans<<'\n';
	return ;
}

signed main(){
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	int _=1;
	// cin>>_;
	while(_--){
		solve();
	}
	return 0;
}

  1. P5788 【模板】单调栈
    见代码模板:
const int maxm=3e6+5,inf=0x3f3f3f3f,mod=998244353;
int n,a[maxm],ans[maxm];

void solve(){
	cin>>n;
	for(int i=1;i<=n;++i){
		cin>>a[i];
	}
	stack<int> q;
	for(int i=n;i>0;--i){
		while(!q.empty()&&a[q.top()]<=a[i]){//注意等号!!!
			q.pop();
		}
		if(q.empty()) ans[i]=0;
		else ans[i]=q.top();
		q.push(i);
	}
	for(int i=1;i<=n;++i){
		cout<<ans[i]<<" \n"[i==n];
	}
	return ;
}

signed main(){
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	int _=1;
//	cin>>_;
	while(_--){
		solve();
	}
	return 0;
}

标签:int,sum,solve,maxm,top,单调
From: https://www.cnblogs.com/Qiansui/p/17515820.html

相关文章

  • 浅谈单调队列优化DP
    对于形如\[f_i=\max(f_{L≤j≤R}+w_i)\]的状态转移方程,也就是转移来自之前某个定长区间的最值,我们可以使用单调队列来维护区间最值,从而优化时间复杂度。烽火传递我们看到题目可以想到用\(f_i\)表示考虑到\(i\)这个烽火台,点第\(i\)个的合法方案中的最小代价那么可以想到......
  • 单调栈复习01_230617
    主要关注栈内元素放置的是什么栈头-栈尾递增还是递减,寻找右侧最大元素,则栈内元素递增;例如Leetcode的每日温度,实则寻找右侧首个大于自身的元素位置,则栈内元素为下标、栈内元素逐渐增大,如果遍历到的元素小于栈顶元素则入栈,否则出栈主要逻辑如下:vector<int>dailyTemperatur......
  • 关于单调栈
    关于单调栈目录概述实现思想例一P5788[模版]单调栈例二P4147玉蟾宫Part1概述单调栈是一种其中元素具有单调性的线性结构。由于其栈的特性,这种结构可以用来处理左边\右边比它小\大的数。实际上,作者认为,遇到题目中元素:“限制”它的左、右且被其左、右“限制”的......
  • 算法学习day60单调栈part03-84
    packageLeetCode.stackpart03;/***84.柱状图中最大的矩形**/publicclassLargestRectangleHistogram_84{publicintlargestRectangleArea(int[]heights){intlength=heights.length;int[]minLeftIndex=newint[length];int......
  • 算法学习day58单调栈part01-739、496
    packageLeetCode.stackpart01;importjava.util.Deque;importjava.util.LinkedList;/***739.每日温度*给定一个整数数组temperatures,表示每天的温度,返回一个数组answer,其中answer[i]是指对于第i天,下一个更高温度出现在几天后。*如果气温在这之后都不会升高,请......
  • 算法学习day59单调栈part02-503、42
    packageLeetCode.stackpart02;importjava.util.Arrays;importjava.util.Stack;publicclassNextGreaterElementII_503{publicint[]nextGreaterElements(int[]nums){//边界判断if(nums==null||nums.length<=1){return......
  • [pandas] 判断某一列是否单调递增
    主要逻辑:在需要判断递增的列通过计算下一行减上一行,如果>0则递增,如果<0则非递增例子:importpandasaspdpd.set_option('display.max_columns',None)#列全部显示pd.set_option('display.max_rows',None)#行全部显示pd.set_option('max_colwidth',1000)#值显示长......
  • 单调队列优化DP
    单调队列优化DP单调栈和单调队列都是借助单调性,及时排除不可能的决策,保持候选集合的高度有效性和秩序性。单调队列尤其适合优化决策取值范围的上、下界均单调变化,每个决策在候选集合中插入或删除至多一侧的问题。利用单调队列,我们可以舍去许多无用的状态,来更快的找出最优解。持......
  • 926.将字符串翻转到单调递增
    问题描述926.将字符串翻转到单调递增(Medium)如果一个二进制字符串,是以一些0(可能没有0)后面跟着一些1(也可能没有1)的形式组成的,那么该字符串是单调递增的。给你一个二进制字符串s,你可以将任何0翻转为1或者将1翻转为0。返回使s单调递增的最小翻转次数。示例......
  • jmeter简单调用接口
    需求:Jmeter软件调用天气预报接口 网站:https://www.showapi.com/搜索第三方的天气接口: 0元,立即购买  注册:yidongzjq 密码:Nari.1234 ......