题意:
有n头牛,每头牛有身高h,所有牛都面朝右边,每头牛可以看到比他矮的牛,
如果有一头牛比他高(或者相等)就看不到再右边的牛了(被挡住了)
求所有牛可以看到的比他矮的牛的数量的总和
分析:
单调栈基本应用,对于每个数,计算他与他右边第一个比他大的数之间有多少数
单调递增栈,栈顶到栈底是递增的
栈中存放下标,每次用下标判断高度是否满足单调性
不满足则用栈顶元素更新答案并将其出栈,继续判断是否满足,直到栈空或者满足条件入栈
code:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#define int long long
using namespace std;
const int maxm=1e5+5;
const int inf=(1LL<<60);
int a[maxm];
int stk[maxm];
int n;
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
while(cin>>n){
int ans=0;
for(int i=1;i<=n;i++){
cin>>a[i];
}
n++;
a[n]=inf;//用于保证最后全部元素都出栈
int head=0;//栈顶指针
for(int i=1;i<=n;i++){//
while(head&&a[i]>=a[stk[head]]){//出栈
ans+=i-stk[head]-1;//添加答案
head--;
}
stk[++head]=i;
}
cout<<ans<<endl;
}
return 0;
}