- // c+v,今天不想学
- func sumSubarrayMins(arr []int) (ans int) {
- const mod int = 1e9 + 7
- n := len(arr)
- left := make([]int, n)
- right := make([]int, n)
- monoStack := []int{}
- for i, x := range arr {
- for len(monoStack) > 0 && x <= arr[monoStack[len(monoStack)-1]] {
- monoStack = monoStack[:len(monoStack)-1]
- }
- if len(monoStack) == 0 {
- left[i] = i + 1
- } else {
- left[i] = i - monoStack[len(monoStack)-1]
- }
- monoStack = append(monoStack, i)
- }
- monoStack = []int{}
- for i := n - 1; i >= 0; i-- {
- for len(monoStack) > 0 && arr[i] < arr[monoStack[len(monoStack)-1]] {
- monoStack = monoStack[:len(monoStack)-1]
- }
- if len(monoStack) == 0 {
- right[i] = n - i
- } else {
- right[i] = monoStack[len(monoStack)-1] - i
- }
- monoStack = append(monoStack, i)
- }
- for i, x := range arr {
- ans = (ans + left[i]*right[i]*x) % mod
- }
- return
- }