Description
给定一个长度为
Constraints
Solution
假设你知道每个最小值
然后通过子答案之和就可以得到答案:
而最小值的覆盖范围可以通过单调栈得出。
Code
class Solution {
public:
int sumSubarrayMins(vector<int>& arr) {
long ans = 0;
constexpr long MOD = 1e9 + 7;
// {leftmost, min_index, min_v}
stack<tuple<size_t, size_t, int>> stk;
auto cal = [MOD](size_t l, size_t i, size_t r, int v) {
long llen = i - l + 1;
long rlen = r - i + 1;
return llen * rlen * v % MOD;
};
for(size_t i = 0; i < arr.size(); ++i) {
auto v = arr[i];
auto leftmost = i;
while(!stk.empty() && v < get<2>(stk.top())) {
auto [tleft, tidx, tv] = stk.top();
stk.pop();
ans += cal(tleft, tidx, i-1, tv);
ans %= MOD;
leftmost = tleft;
}
stk.emplace(leftmost, i, v);
}
while(!stk.empty()) {
auto [l, i, v] = stk.top();
stk.pop();
ans += cal(l, i, arr.size()-1, v);
ans %= MOD;
}
return ans;
}
};