//单调栈
class Solution {
private:
const int BASE = 1e9+7;
public:
int sumSubarrayMins(vector<int>& arr) {
int n = arr.size();
stack<int> inc_stk;
vector<int> ans(n,0);
for(int i = 0;i<n;i++) {
while(!inc_stk.empty()&&arr[inc_stk.top()]>=arr[i]) {
//把栈中大于等于当前元素的值都出栈,说明他们都可以
//以当前元素值为最小值组成子数组
inc_stk.pop();
}
if(inc_stk.empty()) {
//说明栈中的元素均大于等于当前元素,都可以把当前元素作为
//最小值来组成数组
ans[i] = arr[i]*(i+1);
}
else {//只有部分元素可以把当前元素作为最小值来组成数组
//就是说此时栈顶的元素比当前元素小(因为前面不小于当前元素的都出栈了)
//从而栈顶元素的最小值之和可以作为当前数组的最小值
ans[i] = ans[inc_stk.top()] + arr[i]*(i-inc_stk.top());
}
ans[i]%=BASE;
inc_stk.push(i);
}
long ret = 0;
for(int i = 0;i<n;i++) {
ret+=ans[i];
ret%=BASE;
}
return ret;
}
};
10-28
197
