pku3250 Bad Hair Day

http://poj.org/problem?id=3250

单调队列,栈模拟

有 n 头牛头朝东站成一列。每头牛有一定的高度,并且能看到其前面高度比它低的牛的头顶,直到被某头高度大于等于它的高度的牛所挡住。计算每头牛能看到的牛头顶的数量之和。

 1 #include <stdio.h>
 2 #include <stack>
 3 
 4 using namespace std;
 5 
 6 stack<pair<int, int> > s;
 7 long long sum = 0;
 8 
 9 void push(int a, int i)
10 {
11     while((!s.empty()) && s.top().first<=a)
12     {
13         sum += (i - s.top().second - 1);
14         s.pop();
15     }
16     s.push(make_pair(a, i));
17 }
18 
19 int main()
20 {
21     int i, n, a;
22     scanf("%d", &n);
23     for(i=1; i<=n && scanf("%d", &a); i++)
24     {
25         push(a, i);
26     }
27     push(1<<31-1, i);
28     printf("%lld\n", sum);
29     return 0;
30 }

 

转载于:https://www.cnblogs.com/yuan1991/archive/2013/01/19/pku3250.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值