有一列奶牛,大家都向右看,每只牛可以看到在他右侧的奶牛的头,设第i只奶牛可以看到ci只,求ci的和。
单调(递减)栈,记录每只奶牛右侧有几只比他矮。
//递减栈 区间最大值
//1.ans可能到long long = maxn^2 / 2
//2.题目要求严格递减
#include <iostream>
#include <cstdio>
#include <stack>
using namespace std;
const int maxn = 8e4 + 5;
typedef long long ll;
struct node{
int h,r;//身高 能向右边看到的最远距离
}cow[maxn];
stack<node> stk;
int main()
{
int n;
scanf("%d",&n);
for (int i = 0; i < n; i ++) {
scanf("%d",&cow[i].h);
cow[i].r = 0;
}
ll ans = 0;
for (int i = 0; i < n; i ++) {
if(stk.empty() || cow[i].h < stk.top().h ) stk.push(cow[i]);
else {
while(!stk.empty() && cow[i].h >= stk.top().h){//题目要求严格递减才能看到
node t = stk.top();stk.pop();
ans += t.r;
if(!stk.empty()) stk.top().r = stk.top().r + 1 + t.r;
}
stk.push(cow[i]);
}
}
while (!stk.empty()) {
node t = stk.top();stk.pop();
ans += t.r;
if(!stk.empty()) stk.top().r = stk.top().r + 1 + t.r;
}
printf("%lld\n",ans);
return 0;
}