Bad Hair Day Poj 3250 单调栈模板题


10 3 7 4 12 2
逆向思维,求每头牛被其他牛看到的数量
cnt=0
i=0 10    cnt+=0    
i=1 10 3 单增栈    cnt+=1 cnt=1
i=2 10 3 7->10 7 cnt+=1 cnt=2
i=3 10 7 4 cnt+=2 cnt=4
i=4 10 7 4 12->12 cnt=4
i=5 12 2 cnt=5
算法抽象:维护单增栈,cnt+=stack.size()-1

陷阱 等高看不到
10 10
一个都看不到
10 5 10
答案应为1
所以这是一个严格单增栈,不能出现相等的元素!
坑:答案不能用int,要用long long

#include<cstdio>
#include<iostream>
#include<stack>
using namespace std;
//严格单增栈 ,严格! 
void push(stack<int> &a,int b)
{
	if(a.empty() || b<a.top())
	{
		a.push(b);
	}
	else
	{
		while(!a.empty() && b>=a.top())
		{
			a.pop();
		}
		a.push(b);//不要忘记让b入栈!!! 
	} 
} 
int main(){
	int n;
	long long ans=0;//易错:不要用int!!! 
	stack<int> a;
	scanf("%d",&n);
	while(n--)
	{
		int temp;
		scanf("%d",&temp);
		push(a,temp);
		ans+=a.size()-1;
	}
	printf("%lld",ans);
	return 0;
} 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值