Skip to content

Commit 9315bdf

Browse files
committed
Runtime: 23 ms (Top 88.89%) | Memory: 7.00 MB (Top 33.33%)
1 parent 9a9dfc6 commit 9315bdf

File tree

1 file changed

+62
-0
lines changed

1 file changed

+62
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
// Runtime: 23 ms (Top 88.89%) | Memory: 7.00 MB (Top 33.33%)
2+
3+
impl Solution {
4+
pub fn total_strength(strength: Vec<i32>) -> i32 {
5+
const MOD: i64 = 1_000_000_007;
6+
let strength = strength.into_iter().map(|x| x as i64).collect::<Vec<_>>();
7+
let N = strength.len();
8+
let N_i64 = strength.len() as i64;
9+
10+
let mut ps_l = vec![0; strength.len() + 1];
11+
let mut pm_l = vec![0; strength.len() + 1];
12+
13+
for i in 0..N {
14+
ps_l[i + 1] = (ps_l[i] + strength[i]) % MOD;
15+
let i_64 = i as i64;
16+
pm_l[i + 1] = (pm_l[i] + (i_64 + 1) * strength[i]) % MOD;
17+
}
18+
19+
let mut ps_r = vec![0; strength.len() + 1];
20+
let mut pm_r = vec![0; strength.len() + 1];
21+
22+
for i in (0..N).rev() {
23+
ps_r[i] = (ps_r[i + 1] + strength[i]) % MOD;
24+
let i_64 = i as i64;
25+
pm_r[i] = (pm_r[i + 1] + (N_i64 - i_64) * strength[i]) % MOD;
26+
}
27+
28+
let mut stack = vec![];
29+
let mut ans = 0_i64;
30+
31+
for right in 0..=N {
32+
while !stack.is_empty()
33+
&& (right == N || strength[*stack.last().unwrap()] >= strength[right])
34+
{
35+
let pivot = stack.pop().unwrap();
36+
let pivot_i64 = pivot as i64;
37+
38+
let left_i64 = stack.last().map(|x| *x as i64 + 1).unwrap_or(0);
39+
let left = left_i64 as usize;
40+
41+
let right_i64 = right as i64;
42+
43+
let left_sum = (MOD + pm_l[pivot + 1]
44+
- pm_l[left]
45+
- left_i64 * (ps_l[pivot + 1] - ps_l[left]) % MOD)
46+
% MOD;
47+
48+
let right_sum = (MOD + pm_r[pivot + 1]
49+
- pm_r[right]
50+
- (N_i64 - right_i64) * (ps_r[pivot + 1] - ps_r[right]))
51+
% MOD;
52+
53+
let all_sum =
54+
(left_sum * (right_i64 - pivot_i64) + right_sum * (pivot_i64 - left_i64 + 1)) % MOD;
55+
56+
ans = (ans + all_sum * strength[pivot]) % MOD;
57+
}
58+
stack.push(right);
59+
}
60+
ans as i32
61+
}
62+
}

0 commit comments

Comments
 (0)