子陣列的最小值之和(failed)
阿新 • • 發佈:2018-12-10
給定一個整數陣列 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 <= A <= 30000
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; } };