單調棧能夠求得該數左邊離他最近的大於/小於的數(其他問題也可以轉換為此問題)
例如 求 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.柱狀圖中最大的矩形,挺難的,針對每乙個柱需要確定左右比它低的作為邊界,正向遍歷單調棧確定左邊界...