1
- // Runtime: 431 ms (Top 37.35%) | Memory: 110.7 MB (Top 26.25%)
2
1
class Solution {
3
2
public:
4
- int totalStrength (vector<int >& strength) {
5
- int n = strength.size ();
6
- long long ans = 0 , mod = 1e9 + 7 ;
7
- vector<long long > prefix (n + 1 , 0 ), iprefix (n + 1 , 0 ), isuffix (n + 1 , 0 );
8
- for (int i = 1 ; i <= n; i++)
9
- {
10
- prefix[i] = prefix[i - 1 ] + strength[i - 1 ];
11
- iprefix[i] = iprefix[i - 1 ] + (long long )i * (long long )strength[i - 1 ];
12
- isuffix[n - i] = isuffix[n - i + 1 ] + (long long )i * (long long )strength[n - i];
3
+ int mod=1e9 +7 ;
4
+ int Value (vector<int > a, int n){
5
+ vector<long long >pre (n+2 ,0 );
6
+ for (int i=1 ;i<=n;i++)
7
+ pre[i]=(pre[i-1 ]+a[i-1 ])%mod;
8
+ for (int i=1 ;i<=n+1 ;i++)
9
+ pre[i]=(pre[i-1 ]+pre[i])%mod;
10
+ for (int i=n+1 ;i>0 ;i--)
11
+ pre[i]=pre[i-1 ];
12
+
13
+ vector<int > l (n,-1 ),r (n,n);
14
+ stack<int > st;
15
+ // Find all left index
16
+ for (int i = 0 ; i < n; i++){
17
+ while (!st.empty () && a[st.top ()] >= a[i])
18
+ st.pop ();
19
+ if (!st.empty ())
20
+ l[i] = st.top ();
21
+
22
+ st.push (i);
13
23
}
14
- vector<int > l (n, -1 ), r (n, -1 );
15
- stack<int > sl, sr;
16
- for (int i = 0 ; i < n; i++)
17
- {
18
- while (!sl.empty () && strength[sl.top ()] > strength[i])
19
- sl.pop ();
20
- if (sl.empty ())
21
- l[i] = 0 ;
22
- else
23
- l[i] = sl.top () + 1 ;
24
- sl.push (i);
24
+
25
+ while (!st.empty ())
26
+ st.pop ();
27
+
28
+ // Find all right index
29
+ for (int i = n - 1 ; i >= 0 ; i--){
30
+ while (!st.empty () && a[st.top ()] > a[i])
31
+ st.pop ();
32
+
33
+ if (!st.empty ())
34
+ r[i] = st.top ();
35
+
36
+ st.push (i);
25
37
}
26
- for (int i = n - 1 ; i >= 0 ; i--)
27
- {
28
- while (!sr.empty () && strength[sr.top ()] >= strength[i])
29
- sr.pop ();
30
- if (sr.empty ())
31
- r[i] = n - 1 ;
32
- else
33
- r[i] = sr.top () - 1 ;
34
- sr.push (i);
35
- }
36
- for (int i = 0 ; i < n; i++)
37
- {
38
- int lb = l[i], rb = r[i];
39
- long long ln = i - lb + 1 , rn = rb - i + 1 , mv = strength[i], lsv = 0 , rsv = 0 , sv = 0 ;
40
- lsv = (iprefix[i] - iprefix[lb] - lb * (prefix[i] - prefix[lb]) + mod) % mod * rn % mod;
41
- rsv = (isuffix[i + 1 ] - isuffix[rb + 1 ] - (n - rb - 1 ) * (prefix[rb + 1 ] - prefix[i + 1 ]) + mod) % mod * ln % mod;
42
- sv = (lsv + rsv + (ln * rn) * (long long )strength[i]) % mod;
43
- ans = (ans + sv * mv) % mod;
44
- }
45
- return ans;
38
+ // for(int i=0;i<n;i++) cout<<a[i]<<" "; cout<<"\n";
39
+ // for(int i=0;i<n;i++) cout<<l[i]<<" "; cout<<"\n";
40
+ // for(int i=0;i<n;i++) cout<<r[i]<<" "; cout<<"\n";
41
+
42
+ long long ans = 0 ;
43
+ for (int i = 0 ; i < n; ++i) {
44
+ ans += (((pre[r[i] + 1 ] - pre[i + 1 ]) * (i - l[i]) % mod + mod * 2 -
45
+ (pre[i + 1 ] - pre[l[i] + 1 ]) * (r[i] - i) % mod) % mod * a[i]) % mod;
46
+ ans %= mod;
47
+ }
48
+ return (int ) ans;
49
+
50
+ }
51
+ int totalStrength (vector<int >& s) {
52
+ int n=s.size ();
53
+ return Value (s,n);
46
54
}
47
55
};
0 commit comments