难度:3
单调栈问题,转化为求每个点后面第一个大于等于它的元素的位置,如果没有那么就设置为n+1,然后统计一遍输出即可
#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define all(x) (x).begin(), (x).end()
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pa;
const int maxn = 8e4 + 5;
int ans[maxn];
int main() {
int n;
cin >> n;
stack<pa> st;
for (int i = 1; i <= n; i++) {
int x;
cin >> x;
if (i == 1) st.push(make_pair(x, i));
else {
if (x < st.top().fi) st.push(make_pair(x, i));
else {
while (!st.empty() && x >= st.top().fi) {
pa p = st.top(); st.pop();
ans[p.se] = i;
}
st.push(make_pair(x, i));
}
}
}
while (!st.empty()) {
pa p = st.top(); st.pop();
ans[p.se] = n + 1;
}
ll res = 0;
for (int i = 1; i <= n; i++) {
res += ans[i] - i - 1;
}
cout << res;
return 0;
}