poj-3250-Bad Hair Day(单调栈)

博客围绕一道题目展开,一群高度不同的牛从左到右排列,每头牛只能看到右边比它矮的牛的发型,求所有牛能看到的发型总数。解题思路是利用单调递减队列,计算连续递减长度,通过单调递减栈内元素数量来求解答案。

题目链接:http://poj.org/problem?id=3250

题意:一群高度不同的牛从左到右排开,每头牛只能看见它右边的比它矮的牛的发型,若遇到一头高度大于或等于它的牛,则无法继续看到这头牛后面的其他牛。求所有的牛能够看见发型总数。

思路:考虑单调递减队列,即计算连续递减长度的问题,高度递减的时候就全部进栈,来个高个子则将堆栈中的低于高个子的全部弹出,我们不求当前牛向右能看到几头牛,我们求当前牛向左数能被几头牛看到,而这个信息刚好就是单调递减栈内元素的数量减一(减一减的是当前牛,也就是自己不能看到自己),top的值表示当前牛的位置左边有几头牛能看到它,我们把每头牛的top值加起来就是所求的答案(统计top写在了入栈前面,可以省略减一的操作)。

#include<stdio.h>
#include<algorithm>
#define ll long long
using namespace std;
const int N = 800090;
ll top, n, ans;
ll h, stk[N];
int main()
{
    scanf("%lld",&n);
    for(int i = 1; i <= n; i++)
    {
        scanf("%lld",&h);
        while(top > 0 && h >= stk[top]) top--;
        ans += top;
        stk[++top] = h;
    }
    printf("%lld\n",ans);
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值