题目:907. 子数组的最小值之和
思路:单调栈
class Solution {
public:
int sumSubarrayMins(vector<int>& arr) {
int MOD = 1e9+7;
int n = arr.size();
int ans = 0;
vector<int> li(n,-1);
vector<int> ri(n,n);
stack<int> q;
for(int i=0;i<n;++i){
while(!q.empty() && arr[q.top()]>arr[i]){
ri[q.top()]=i;
q.pop();
}
q.push(i);
}
while(!q.empty()){
q.pop();
}
for(int i=n-1;i>=0;i--){
while(!q.empty() && arr[q.top()]>=arr[i]){
li[q.top()]=i;
q.pop();
}
q.push(i);
}
for(int i=0;i<n;i++){
int a=i-li[i];
int b=ri[i]-i;
ans+=a*1L*b%MOD*arr[i]%MOD;
ans%=MOD;
}
return ans;
}
};