题目描述:

有一群奶牛(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;
}