-
-
Notifications
You must be signed in to change notification settings - Fork 291
Expand file tree
/
Copy path907.cpp
More file actions
58 lines (50 loc) · 1.9 KB
/
907.cpp
File metadata and controls
58 lines (50 loc) · 1.9 KB
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
__________________________________________________________________________________________________
sample 44 ms submission
static const auto fast = []() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
return 0;
} ();
class Solution {
public:
int sumSubarrayMins(std::vector<int>& nums) {
if (nums.size() == 0) return 0;
constexpr ssize_t mod = 10e8 + 7;
ssize_t sum = 0;
std::deque<ssize_t> dq;
std::vector<ssize_t> aux(nums.size(), 1);
for (ssize_t i = 0; i < nums.size(); ++i) {
while (!dq.empty() && nums[dq.back()] > nums[i]) dq.pop_back();
aux[i] *= 1 + i - ((dq.empty() ? -1 : dq.back()) + 1);
dq.push_back(i);
}
dq.clear();
for (ssize_t i = nums.size() - 1; i >= 0; --i) {
while (!dq.empty() && nums[dq.back()] >= nums[i]) dq.pop_back();
aux[i] *= 1 + (((dq.empty() ? nums.size() : dq.back()) - 1) - i);
dq.push_back(i);
sum = ((sum % mod) + ((nums[i] * aux[i]) % mod)) % mod;
}
return sum % mod;
}
};
__________________________________________________________________________________________________
sample 12576 kb submission
class Solution {
public:
int sumSubarrayMins(vector<int>& A) {
constexpr int kMod = 1e9 + 7;
int ans = 0;
for(int i = 0; i < A.size(); ++i)
{
int left = 0;
for(int j = i - 1; j >= 0 && A[j] > A[i]; --j, ++left);
int right = 0;
for(int j = i + 1; j < A.size() && A[j] >= A[i]; ++j, ++right);
ans = (ans + static_cast<long>(A[i]) * (left + 1) * (right + 1)) % kMod;
}
return ans;
}
};
__________________________________________________________________________________________________