單調棧問題

2021-10-11 05:35:59 字數 2201 閱讀 4585

單調棧能夠求得該數左邊離他最近的大於/小於的數(其他問題也可以轉換為此問題)

例如 求 a[i]左邊第乙個小於a[i]的數

對於a[i]每次入棧如果有大於等於a[i]的數,直接出棧

證明:如果求左側第乙個小於a[i]的數

如果a[i]入棧後左側有大於a[i]的數,則那個數不僅是大值而且還出現的比較早,所以他永遠不會被用到,所以直接出棧

單調棧板子

#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

const int n=3e6+10;

int a[n],q[n],ans[n];

int main()

for(int i=0;i奶牛排隊

奶牛在熊大媽的帶領下排成了一條直隊。

顯然,不同的奶牛身高不一定相同……

現在,奶牛們想知道,如果找出一些連續的奶牛,要求最左邊的奶牛 a 是最矮的,最右邊的 b 是最高的,且 bb 高於 aa 奶牛。中間如果存在奶牛,則身高不能和 a,ba,b 奶牛相同。問這樣的奶牛最多會有多少頭?

從左到右給出奶牛的身高,請告訴它們符合條件的最多的奶牛數(答案可能是 0,2,但不會是 1)。

第一行乙個正整數 nn,表示奶牛的頭數。

接下來 nn 行,每行乙個正整數,從上到下表示從左到右奶牛的身高 h_ihi​。

一行乙個整數,表示最多奶牛數。

輸入 #1複製

51234

1

輸出 #1複製

4
樣例解釋

取第 11 頭到第 44 頭奶牛,滿足條件且為最多。

題目大意:找個乙個區間[a,b] a最小,b最大的區間

因為 a是區間內最矮的,所以 [a.b]中,都比 a 高。所以只要 aa 右側第乙個 ≤a 的奶牛位於 b 的右側,則 a 合法

同理,因為b是區間內最高的,所以 [a.b] 中,都比 b 矮。所以只要 b 左側第乙個 ≥b≥b 的奶牛位於 a 的左側,則 b 合法

用兩個單調棧,對於每個a[i] 求它右側第乙個小於a[i]的下標,求他左側第乙個大於a[i]的下標

#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

const int n=1e5+10;

int a[n],l[n],r[n],q[n];

int main()

int tt=0;

for(int i=1; i<=n; i++)

if(i良好的感覺

對於乙個區間求temp=sum[l~r]*a[i]的最值

暴力解法,對於a[i]求左側第乙個小於該值的下標,求右側第乙個小於該值的下標,得到區間l ~r然後字首和*a[i]

#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

const int n=1e5+10;

ll a[n],l[n],r[n],q[n],sum[n];

int main()

int tt=0;

for(int i=1; i<=n; i++)

n++;

a[n]=0;

sum[n]=sum[n-1]+a[n];

int tt=0;

for(int i=1; i<=n; i++)

l[i]=sum[i]-sum[ q[tt] ];

q[++tt]=i;

} ll ans=0;

for(int i=1; i<=n; i++)

printf("%lld",ans);

return 0;

}

單調棧問題

從名字上就聽的出來,單調棧中存放的資料應該是有序的,所以單調棧也分為單調遞增棧和單調遞減棧 單調遞增棧 棧中資料出棧的序列為單調遞增序列 單調遞減棧 棧中資料出棧的序列為單調遞減序列 ps 這裡一定要注意所說的遞增遞減指的是出棧的順序,而不是在棧中資料的順序 單調棧板子題 這題是簽到題,很明顯就是乙...

單調棧 模板 單調棧模板

biu 單調棧主要用於求取左邊第乙個比它大,或者比它小的數。就比如站隊隨便排成一列,可以求到每個人後面第乙個比他高的人。同理可以推廣至右邊,比它矮均可。這就是單調遞增棧 遞減棧,從前至 棧,從後向前入棧的區別了。單調棧比較抽象,非常具有智慧型的想法,可應用的場景相當少,根據幾個經典題目體會它的用法會...

力扣 單調棧與單調佇列問題

單調棧 1.402.移掉k位數字 需要注意邊界情況,去除完無字元返回 判斷時不能有 號,棧內應該是不嚴格遞增的。2.316.去除重複字母 需要借助雜湊表來統計出現次數,並且標記是否已經存在於棧內。3.84.柱狀圖中最大的矩形,挺難的,針對每乙個柱需要確定左右比它低的作為邊界,正向遍歷單調棧確定左邊界...