[洛谷] P2866 [USACO06NOV]糟糕的一天Bad Hair Day

题目描述

农民John的某 N 头奶牛 (1 <= N <= 80,000) 正在过乱头发节!由于每头牛都意识到自己凌乱不堪的发型,FJ 希望统计出能够看到其他牛的头发的牛的数量。   每一头牛 i有一个高度 h[i] (1 <= h[i] <= 1,000,000,000)而且面向东方排成一排。因此,第i头牛可以看到她前面的那些牛的头,(即i+1, i+2,等等),只要那些牛的高度严格小于她的高度。

题目解析

考虑从前往后扫,求出每一头牛的贡献。

然后我发现只要维护没有被当前牛挡住的牛的个数就行了。

显然就是用个单调栈维护一下就可以了,严格单调递减的。

代码

#include
#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;
}

你可能感兴趣的:([洛谷] P2866 [USACO06NOV]糟糕的一天Bad Hair Day)