这个题用类似单调队列的思想,并反过来思考,想每个牛能被多少牛看到,那么在这之前如果有小于等于当前牛高度的那么一定看不到了。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<stack>
using namespace std;
const int maxn=8e4+100;
int n,a[maxn];
stack<int> s;
int main()
{
while(scanf("%d",&n)!=EOF)
{
while(!s.empty())
s.pop();
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
long long ans=0;
for(int i=1;i<=n;i++)
{
while(!s.empty()&&s.top()<=a[i])
s.pop();
ans+=s.size();
s.push(a[i]);
}
printf("%I64d\n",ans);
}
return 0;
}