POJ 3250 Bad Hair Day 详解——单调栈

3250 -- Bad Hair Day (poj.org)http://poj.org/problem?id=3250题意:一群牛排成一排,牛a 向右看能比他身高小的牛,直到一头身高比 牛a 高的牛挡住 牛a的视野,求 牛0 到 牛n-1 中 每头牛能看到其他牛的总数。

思路:单调栈;

将这个栈维护成从栈底至栈顶严格单调递减;

下面由样例举例;

一共有6头牛;

这六头牛的身高从左到右分别为: 10、3、7、4、12、2;

序号012345
身高10374122

首先身高为10的牛的下标进栈,3小于10,身高为3的牛的下标进栈;

牛的下标01
这头牛的身高103

然后7大于3,这代表身高为3的牛的视野被身高为7的牛挡住了;

于是身高为3的牛弹出,身高为3的牛 能看到 (身高为7的牛下标-身高为3的牛下标-)-1  个牛,也就是0头牛,身高为3的牛的下标出栈,7小于10,身高为7的牛的下标进栈;

牛的下标02
这头牛的身高107

接着4小于7,身高为4的牛的下标进栈;

牛的下标023
这头牛的身高1074

之后,身高为12(下标为4)的牛来了;

身高为4的牛看不见了,身高为4的牛 能看到 (身高为12的牛下标-身高为4的牛下标-)-1  个牛,也就是0头牛;

身高为7的牛看不见了,身高为7的牛 能看到 (身高为12的牛下标-身高为7的牛下标-)-1  个牛,也就是1头牛;

身高为10的牛看不见了,身高为10的牛 能看到 (身高为12的牛下标-身高为10的牛下标-)-1  个牛,也就是3头牛;

栈空了,身高为12的牛的下标进栈;

2小于12,身高为2的牛的下标进栈;

牛的下标45
这头牛的身高122

这时,牛群到底了;

假设有一头身高无限大的牛来了 下标为n,这里n=6;

身高为2的牛看不见了,身高为2的牛 能看到 (身高为无限大的牛下标-身高为2的牛下标-)-1  个牛,也就是0头牛;

身高为12的牛看不见了,身高为12的牛 能看到 (身高为无限大的牛下标-身高为12的牛下标-)-1  个牛,也就是1头牛;

所以总数是

0+0+1+3+0+1=5;

代码如下:时间限制是2s,最高的牛高1000000000,所以无限要比这个数大。

#include<iostream>
#include<stack>
const int inf=1000000003;
using namespace std;
int a[80010];
stack<int> st;
long long ans=0;
int n;
int main()
{
    cin>>n;
	for(int i=0; i<n; i++){
		cin>>a[i];
	}
	a[n]=inf;
    for(int i=0; i<=n; i++){
		while(!st.empty()&&a[st.top()]<=a[i]){
            ans+=(i-st.top()-1);
            st.pop();
        }
        st.push(i);
	}
    cout<<ans;
	return 0;
}

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值