单调栈
// 求离某个元素最近的第一个比他大的或者比他小的元素的角标
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 2e5+10;
int q[N], hh = -1, a[N];
for(int i = 1; i <= n; i ++){
while(hh >= 0 && a[q[hh]] < a[i]){
res[q[hh]] = i;
hh --;
}
q[++hh] = i;
}
枚举每一个元素的高度,他左边和右边最远能到哪里
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 2e5+10;
int a[N], p[N], phh = -1, l[N], lhh = -1;
int pre[N], later[N];
int main(){
int n; cin >> n;
for(int i = 1; i <= n; i ++) scanf("%d", &a[i]);
for(int i = 1; i <= n; i ++) later[i] = n + 1;
for(int i = 1; i <= n; i ++){
while(phh >= 0 && a[p[phh]] > a[i]){
later[p[phh]] = i;
phh --;
}
p[++phh] = i;
}
for(int i = n; i >= 1; i --){
while(lhh >= 0 && a[l[lhh]] > a[i]){
pre[l[lhh]] = i;
lhh --;
}
l[++lhh] = i;
}
LL res = 0;
for(int i = 1; i <= n; i ++){
res = max(res, (LL)a[i] * (later[i] - pre[i] - 1));
}
cout << res << endl;
return 0;
}