Skip to content

Commit b53b7fa

Browse files
committed
Runtime 293 ms (Top 44.21%) | Memory 101.0 MB (Top 72.63%)
1 parent bbbd6e3 commit b53b7fa

File tree

1 file changed

+49
-41
lines changed

1 file changed

+49
-41
lines changed
Lines changed: 49 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,55 @@
1-
// Runtime: 431 ms (Top 37.35%) | Memory: 110.7 MB (Top 26.25%)
21
class Solution {
32
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);
1323
}
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);
2537
}
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);
4654
}
4755
};

0 commit comments

Comments
 (0)