poj3250---Bad Hair Day(单调栈)

题目来源: http://poj.org/problem?id=3250

题意

有n头牛,身高不一致,从左往右排列开,每头牛都可以看到其他高度比他低的牛,当然:3,5,4这样不行,统计一下每头牛可以看到的其他牛的总和。

思路

利用单调栈去维护一个从左往右单调递减的区间,以O(n)的复杂度来解决这到题。
模拟一下样例:
10 3 7 4 12 2 。
输入10,3,也就是一号牛可以看到2号牛,然后输入7,因为7和3比较,要使得成为一个单调递减的序列,就把3去了,序列变成了10,7,此时的一号牛同样可以看到2号牛,然后在输入4,序列成了10,7,4,一号牛和二号牛都可以看到三号牛,以此类推。

代码

#include
int a[80000+10];
int main()
{
    long long sum=0;
    int n,l=-1;
    scanf("%d",&n);
    for(int i=1; i<=n; i++)
    {
        int x;
        scanf("%d",&x);
        while(l>=0&&x>=a[l])
            l--;
        a[++l]=x;
        sum+=l;
    }
    printf("%lld\n",sum);
}

你可能感兴趣的:(ACM竞赛,【数据结构】--其他,ACM的进程)