アイデア:
各デジタルA [i]のために、単調スタック実測値[i]が最小間隔の数、累積結果を乗算のすべてについて。O(N)の時間複雑。
実装:
1 クラスソリューション 2 { 3 公共: 4 int型 sumSubarrayMins(ベクトル< INT >&A) 5 { 6 INT RES = 0 。 7 スタック< 整数 > ST; 8 INT N = A.size()。 9 CONST INT MOD = 1E9 + 7 。 10 のために(int型 I = 0 ; iがN <I ++は) 11 { 12 ながら(!st.empty()&& A [i]が< [st.top()]) 13 { 14 INT TMP = st.top()。st.pop(); 15 INT最後= st.empty()?- 1 :st.top(); 16の RES =(RES +(I - TMP)*(TMP -最後)%MOD * A [TMP]%MOD)%MOD。 17 } 18 st.push(I)。 19 } 20 ながら(!st.empty()) 21 { 22 INT TMP = st.top()。st.pop(); 23 INT最後= st.empty()?- 1 :st.top(); 24の RES =(RES +(N - TMP)*(TMP -最後)%MOD * A [TMP]%MOD)%MOD。 25 } 26の リターンRES。 27 } 28 }