-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.cpp
57 lines (50 loc) · 1.67 KB
/
main.cpp
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
class Solution {
public:
long long subArrayRanges(vector<int>& nums) {
long long result = 0;
for (int l = 0; l < nums.size(); ++l) {
int mn = numeric_limits<int>::max();
int mx = numeric_limits<int>::min();
for (int r = l; r < nums.size(); ++r) {
mx = max(mx, nums[r]);
mn = min(mn, nums[r]);
result += mx - mn;
}
}
return result;
}
};
class Solution {
public:
long long subArrayRanges(vector<int>& nums) {
int n = nums.size();
auto subArraySum = [&](function<bool(int, int)> cmp) -> long long {
vector<int> s;
vector<int> right(n);
for (int i = 0; i < n; ++i) {
while (!s.empty() && cmp(nums[s.back()], nums[i])) {
right[s.back()] = i;
s.pop_back();
}
s.push_back(i);
}
for (int i : s) right[i] = n;
s.clear();
vector<int> left(n);
for (int i = n - 1; i >= 0; --i) {
while (!s.empty() && (cmp(nums[s.back()], nums[i]) ||
nums[s.back()] == nums[i])) {
left[s.back()] = i;
s.pop_back();
}
s.push_back(i);
}
for (int i : s) left[i] = -1;
long long result = 0;
for (int i = 0; i < n; ++i)
result += 1LL * nums[i] * (i - left[i]) * (right[i] - i);
return result;
};
return subArraySum(less<int>()) - subArraySum(greater<int>());
}
};