아이디어 :
각 디지털 A [i]를 들어, 단조롭게 스택 발견 [I]의 최소 간격의 수와 누적 된 결과를 승산의 모든. O (N)의 시간 복잡도.
구현 :
1 급 솔루션 2- { 3 공개 : 4 의 INT sumSubarrayMins (벡터 < INT > & A) 5 { 6 INT 입술 = 0 ; 7 스택 < INT > 과 같다 8 INT의 N = A.size (); 9 CONST INT MOD 1E9 + = 7 ; (10) 에 대한이 ( 값 int = 1을 0 ; i가 ++] i가 N < ) 11 { 12 잠시(! st.empty () && A [I] < A [st.top ()]) 13 { 14 INT의 TMP = st.top (); st.pop (); 15 INT 마지막 = st.empty ()? - 1 : st.top (); 16 입술 = (입술 + (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 입술 = (입술 + (N - TMP) * (TMP - 최종) MOD % * A [TMP] % MOD) % MOD; 25 } 26 리턴 입술; 27 } 28 }