-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathProblem_2281_totalStrength.cc
65 lines (61 loc) · 1.44 KB
/
Problem_2281_totalStrength.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <vector>
using namespace std;
// TODO: figure it out
class Solution
{
private:
static constexpr int MOD = 1000000007;
public:
int totalStrength(vector<int>& strength)
{
int n = strength.size();
int pre = strength[0] % MOD;
vector<int> sumsum(n);
sumsum[0] = pre;
for (int i = 1; i < n; i++)
{
pre = (pre + strength[i]) % MOD;
sumsum[i] = (sumsum[i - 1] + pre) % MOD;
}
vector<int> stack(n);
int size = 0;
int ans = 0;
for (int i = 0; i < n; i++)
{
while (size > 0 && strength[stack[size - 1]] >= strength[i])
{
int m = stack[--size];
int l = size > 0 ? stack[size - 1] : -1;
ans = (ans + sum(strength, sumsum, l, m, i)) % MOD;
}
stack[size++] = i;
}
while (size > 0)
{
int m = stack[--size];
int l = size > 0 ? stack[size - 1] : -1;
ans = (ans + sum(strength, sumsum, l, m, n)) % MOD;
}
return ans;
}
int sum(vector<int>& arr, vector<int>& sumsum, int l, int m, int r)
{
long left = sumsum[r - 1];
if (m - 1 >= 0)
{
left = (left - sumsum[m - 1] + MOD) % MOD;
}
left = (left * (m - l)) % MOD;
long right = 0;
if (m - 1 >= 0)
{
right = (right + sumsum[m - 1]) % MOD;
}
if (l - 1 >= 0)
{
right = (right - sumsum[l - 1] + MOD) % MOD;
}
right = (right * (r - m)) % MOD;
return (int) (((left - right + MOD) % MOD * arr[m]) % MOD);
}
};