1. 程式人生 > >子陣列的最小值之和(failed)

子陣列的最小值之和(failed)

給定一個整數陣列 A,找到 min(B) 的總和,其中 B 的範圍為 A 的每個(連續)子陣列。

由於答案可能很大,因此返回答案模 10^9 + 7

示例:

輸入:[3,1,2,4]
輸出:17
解釋:
子陣列為 [3],[1],[2],[4],[3,1],[1,2],[2,4],[3,1,2],[1,2,4],[3,1,2,4]。 
最小值為 3,1,2,4,1,1,2,1,1,1,和為 17。

提示:

  1. 1 <= A <= 30000
  2. 1 <= A[i] <= 30000

個人TLE答案 暴力法 就不發了 On3 丟人

拿第一的dalao(@cai_lw)的答案來分析一波 (以後

typedef long long ll;
class Solution {
    const int P=1000000007;
public:
    int sumSubarrayMins(vector<int>& a) {
        int n=a.size();
        vector<int> l(n,-1),r(n,n),st;
        for(int i=0;i<n;i++){
            while(!st.empty()&&a[st.back()]>a[i])st.pop_back();
            if(!st.empty())l[i]=st.back();
            st.push_back(i);
        }
        st.clear();
        for(int i=n-1;i>=0;i--){
            while(!st.empty()&&a[st.back()]>=a[i])st.pop_back();
            if(!st.empty())r[i]=st.back();
            st.push_back(i);
        }
        int ans=0;
        for(int i=0;i<n;i++){
            int d=r[i]-l[i]-1;
            ans=(ll(ans)+ll(i-l[i])*ll(r[i]-i)*ll(a[i]))%P;
        }
        return ans;
    }
};