/*class Solution
{
public:
using myType = pair<int, int>;
struct cmp {
bool operator()(const myType& m1, const myType& m2) const { return m1.second > m2.second; }
};
int sumSubarrayMins(vector<int>& A)
{
int len = A.size();
if (len == 0) {
return 0;
}
int sum = 0;
// 双端队列插入的时候把最大值放队头
for (int i = 1; i <= len; i++) {
priority_queue<myType, vector<myType>, cmp> pq; // care1!只能这样写
for (int k = 0; k < i; k++) {
pq.push({k, A[k]});
}
cout << endl;
sum += pq.top().second; // 初始窗口
for (int k = i; k < len; k++) {
pq.push({k, A[k]});
while (pq.top().first < (k - i + 1)) {
pq.pop();
}
sum += pq.top().second;
}
}
return sum;
}
};*/
class Solution
{
public:
using myType = pair<int, int>;
int sumSubarrayMins(vector<int>& A)
{
int len = A.size();
if (len == 0) {
return 0;
}
int sum = 0;
// 双端队列插入的时候把最大值放队头
auto f = [&A](int x, int y) { return A[x] > A[y]; };
for (int i = 1; i <= len; i++) {
priority_queue<int, vector<int>, decltype(f)> pq(f); // care2!只能这样写
for (int k = 0; k < i; k++) {
pq.push(k);
}
cout << endl;
sum += A[pq.top()]; // 初始窗口
for (int k = i; k < len; k++) {
pq.push(k);
while (pq.top() < (k - i + 1)) {
pq.pop();
}
sum += A[pq.top()];
}
}
return sum;
}
};