题目描述
农民John的某 N 头奶牛 (1 <= N <= 80,000) 正在过乱头发节!由于每头牛都意识到自己凌乱不堪的发型,FJ 希望统计出能够看到其他牛的头发的牛的数量。 每一头牛 i有一个高度 h[i] (1 <= h[i] <= 1,000,000,000)而且面向东方排成一排。因此,第i头牛可以看到她前面的那些牛的头,(即i+1, i+2,等等),只要那些牛的高度严格小于她的高度。
题目解析
考虑从前往后扫,求出每一头牛的贡献。
然后我发现只要维护没有被当前牛挡住的牛的个数就行了。
显然就是用个单调栈维护一下就可以了,严格单调递减的。
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,ans;
stack<ll> s;
void fun(ll x)
{
while(!s.empty()&&s.top()<=x)
s.pop(),ans+=s.size();
s.push(x);
}
int main()
{
freopen("badhair.in","r",stdin);
freopen("badhair.out","w",stdout);
cin>>n;
for(ll i=1,x;i<=n;i++)
{
cin>>x;
fun(x);
}
fun(1e9+7);
cout<<ans;
}