题目描述:
有一群奶牛(1≤N≤80,000),排一排,然后统计每个奶牛能看到其右边的奶牛的头的数量(这里要用longlong)
思路
把思想转换成统计每个牛能被其左边多少头牛看到,那么当统计到第i头的时候,如果第i头牛高度大于等于前面的牛的话,那么前面的牛一定不会
再看到更多的牛了,这个时候就可以弹出该牛。
当遇到高度大于第i头牛的时候就停止弹出,如此反复,栈就是单调的,栈的大小就是能看到第i头牛的牛的数量(都高于第i头牛且是单调的)
#代码
#include<iostream>
using namespace std;
typedef long long LL;
const int N=1e5+10;
LL cnt;
int stk[N];
int top;
int h[N];
// 把思想反过来,变成看当前奶牛能够被前面的多少奶牛看到(这就是栈大小)
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int x;
cin>>x;
while(top&&stk[top-1]<=x) top--; //如果两个相等的话,也是要出栈的,因为也看不到右边的东西
cnt+=top;
stk[top++] = x;
}
cout<<cnt;
}