一开始想到了dp, 不过由于一些细节,没想通。结束后才想出来了。
int sumSubarrayMins(int* arr, int arrSize){
int mod = 1e9 + 7;
int n = arrSize;
vector<int> dp1(n, 1);
vector<int> dp2(n, 1);
for (int i = 1; i < n; i++)
{
if (arr[i] < arr[i - 1])dp1[i] = dp1[i-1] + 1;
}
for (int i = n-2; i>=0; i--)
{
if (arr[i] < arr[i + 1])dp2[i] = dp2[i + 1] + 1;
}
int res = 0;
for (int i = 0; i < n; i++)
{
int a = dp1[i];
int idx = i - a;
while (idx>=0 && arr[idx]>arr[i])
{
a += dp1[idx];
idx -= dp1[idx];
}
int b = dp2[i];
idx = i + b;
while (idx<n && arr[idx]>arr[i])
{
b += dp2[idx];
idx += dp2[idx];
}
res = (int)(res +a*b*arr[i]) % mod;
}
return res;
}