传送门 0最大区间 - 蓝桥云课
详见注解
const int N = 3e5 + 10;
int n;
LL stk[N],top;
LL a[N],l[N],r[N];
void solve()
{
cin >> n;
for (int i = 1;i <= n;i ++) cin >> a[i];
//找左右第一个比a[i]小的位置
for (int i = 1;i <= n;i ++)
{
while(top && a[stk[top]] >= a[i]) top --;
if (top) l[i] = stk[top];
else l[i] = 0;
stk[++top] = i;
}
top = 0;
for (int i = n;i >= 1;i --)
{
while(top && a[stk[top]] >= a[i]) top --;
if (top) r[i] = stk[top];
else r[i] = n + 1;
stk[ ++top] = i;
}
// for (int i = 1;i <= n;i ++) cout << l[i] << " "; cout << endl;
// for (int i = 1;i <= n;i ++) cout << r[i] << " "; cout << endl;
LL ans = 0;
for (int i = 1;i <= n;i ++)
ans = max(ans,a[i] * (r[i] - l[i] - 1));区间长度-两端 == r - l + 1 - 2;
cout << ans << endl;
}