- 找到以每个元素作为最小值的区间,并求和,求区间和的最值
static const int MOD = 1e9 + 7;
const int N = 1e5 + 10;
typedef long long LL;
int h[N], l[N], r[N], q[N];
LL s[N];
class Solution {
public:
int maxSumMinProduct(vector<int>& nums) {
int n = nums.size();
for(int i = 1; i <= n; i ++){
h[i] = nums[i - 1];
s[i] = s[i - 1] + h[i];
}
h[0] = h[n + 1] = 0;
int tt = 0;
q[0] = 0;
for(int i = 1; i <= n; i ++){
while(h[i] <= h[q[tt]]) tt --;
l[i] = q[tt];
q[++ tt] = i;
}
tt = 0;
q[0] = n + 1;
for(int i = n; i >= 1; i --){
while(h[i] <= h[q[tt]]) tt --;
r[i] = q[tt];
q[++ tt] = i;
}
LL res = 0;
for(int i = 1; i <= n; i ++)
res = max(res, h[i] * (s[r[i] - 1] - s[l[i]]));
return res % MOD;
}
};