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<stdio.h>
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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值