简简单单
2024-06-02 15:18:43
发布于:广东
4阅读
0回复
0点赞
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> arr(n);
for (int i = 0; i < n; ++i) {
cin >> arr[i];
}
stack<int> s;
vector<long long> left(n), right(n);
// 计算每个元素左侧第一个比它小的元素的位置
for (int i = 0; i < n; ++i) {
while (!s.empty() && arr[s.top()] >= arr[i]) {
s.pop();
}
if (s.empty()) {
left[i] = i + 1;
} else {
left[i] = i - s.top();
}
s.push(i);
}
while (!s.empty()) {
s.pop();
}
// 计算每个元素右侧第一个比它小的元素的位置
for (int i = n - 1; i >= 0; --i) {
while (!s.empty() && arr[s.top()] >= arr[i]) {
s.pop();
}
if (s.empty()) {
right[i] = n - i;
} else {
right[i] = s.top() - i;
}
s.push(i);
}
long long ans = 0;
for (int i = 0; i < n; ++i) {
ans = max(ans, arr[i] * (left[i] + right[i] - 1));
}
cout << ans << endl;
return 0;
}
这里空空如也
有帮助,赞一个