首页 > 其他分享 >单调栈

单调栈

时间:2023-08-08 23:35:08浏览次数:56  
标签:wd int top 元素 ans include 单调

Largest Rectangle in a Histogram

经典题

单调栈:保持栈内元素单调递增
因为如果递减 后面的元素的高度就会替换前面的元素的高度
前面元素等价于多个后面元素
当有新元素加入是将原先的递增序列从后往前更新答案
最后使得栈保持原有性质

这样可以保证每个元素只会被考虑一次,不用重复向前查找第一个低于的

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <stack>
using namespace std ;

typedef long long ll ;
const int N = 1000010 ;

int n ;
int a[N] ;
stack <pair<int, int> > s ;
ll ans ;

int main() {
	while (scanf("%d", &n)) {
		if (n == 0) break ;
		for (int i = 1; i <= n; i++) scanf("%d", &a[i]) ;
		a[++n] = 0 ;
		while (!s.empty()) s.pop() ;
		ans = 0 ;
		s.push(make_pair(a[1], 1)) ;
		for (int i = 2; i <= n; i++) {
			if (a[i] >= s.top().first) s.push(make_pair(a[i], 1)) ; 
			else {
				int wd = 0 ;
				while (!s.empty() && s.top().first > a[i]) {
					wd += s.top().second ;
					ans = max(ans, 1ll * wd * s.top().first) ;
					s.pop() ;
				}
				s.push(make_pair(a[i], wd + 1)) ;
			}
		}
		printf("%lld\n", ans) ;
	}    
}

标签:wd,int,top,元素,ans,include,单调
From: https://www.cnblogs.com/lighthqg/p/17615694.html

相关文章

  • 单调栈算法
    单调栈算法单调栈,就是一个栈,不过栈内元素保证单调性。即,栈内元素要么从小到大,要么从大到小。//单调栈算法#include<bits/stdc++.h>#defineregregisterusingnamespacestd;//读取输入,并返回一个整数inlineintread(){ intx=0,f=1; charch=getchar(); while(ch<'......
  • 多重背包 (单调队列)
    题目链接#include<bits/stdc++.h>usingll=longlong;constintN=1E3+5,M=2E4+5;intn,m;intv[N],w[N],s[N];intf[M];intl,r,q[M];intcalc(inti,intu,intk){ returnf[k*v[i]+u]-k*w[i];}intmain(){ std::ios::sync_with_......
  • dijkstra + 单调栈优化
    打Div.3发现两个最短路板子题一个用的SPFA一个用的邻接矩阵,赶紧补个。#include<iostream>#include<queue>#defineMAXN20010usingnamespacestd;constintinf=2147483647;intn,m,s,t,cnt;intdis[MAXN],h[MAXN],to[MAXN],val[MAXN],nxt[MAXN];boolvis[MAXN]......
  • Newnode's NOI(P?)模拟赛 第二题 dp决策单调优化
    其实直接暴力O(n3)DP+O2O(n^3)DP+O_2O(n3)DP+O2优化能过…CODEO(n3)O(n^3)O(n3)先来个O(n3)O(n^3)O(n3)暴力DP(开了O2O_2O2)100分代码(极限数据0.5s0.5s0.5s)#include<cstdio>#include<cstring>#include<algorithm>usingnamespacestd;......
  • 单调队列
    一个支持在队尾插入,队头和队尾删除的队列,整个队列呈单调性如果要求最大值则维护一个递减的单调队列,最小值则递增用deque写很方便(前几天用数组模拟队列代码调不出bug难受死了)例题 P1886滑动窗口思路:用一个deque,存点的序号(用于判断是否过期)和点的数字。每次新增加一个元素,都......
  • 语音合成技术汇总1:Glow-TTS:通过单调对齐实现文本到语音的生成流
    今天开始开一期语音合成经典论文的翻译Glow-TTS:通过单调对齐实现文本到语音的生成流摘要:最近,文本到语音(Text-to-Speech,TTS)模型,如FastSpeech和ParaNet,被提出以并行方式从文本生成mel频谱图(mel-spectrograms)。尽管并行TTS模型具有优势,但它们不能在没有自回归TTS模型作为外部对齐......
  • 单调栈算法模板
    单调栈模板:单调栈模板:for(遍历这个数组)while(栈不为空&&栈顶元素<或者>当前元素) 栈顶元素出栈 更新结果 当前数据入栈例如单调递增的stack,python实现就是: stack=[] foriinrange(0,len(arr)): whilestackandstack[-1]>arr[i]: stack.po......
  • 单调栈
    定义具有单调性的栈结构,该数据结构的目的是快速找到与一个元素距离最近的元素过程(摘自oiwiki)插入将一个元素插入单调栈时,为了维护栈的单调性,需要在保证将该元素插入到栈顶后整个栈满足单调性的前提下弹出最少的元素。例如,栈中自顶向下的元素为{0,11,45,81}。插入元素14......
  • LeetCode 239. Sliding Window Maximum 单调队列
    Youaregivenanarrayofintegersnums,thereisaslidingwindowofsizekwhichismovingfromtheveryleftofthearraytotheveryright.Youcanonlyseetheknumbersinthewindow.Eachtimetheslidingwindowmovesrightbyoneposition.Return......
  • 最长单调上升子序列(贪心+二分)
    这个的思路就是再开一个数组,存储长度为i的最长上升子序列的最后一个数字是多少,这个数组可以保证递增,之后开始二分,只要当前这个数是大于i-1的数但小于i的数,那就可以更新i的数,这里就是贪心的思想,相同长度结尾数字越小越好intlen=0;for(inti=1;i<=n;i++){intl=1,r=......