poj-3250单调栈)

头发不好的一天
 

农夫约翰的一些 N 头奶牛(1 ≤ N ≤ 80,000 头)的头发很糟糕!由于每头奶牛都对自己凌乱的发型有自知之明,FJ想数一数能看到其他奶牛头顶的其他奶牛的数量。

每头奶牛都有一个指定的高度h我(1 ≤h我≤ 1,000,000,000),并且站在一排奶牛中,全部面向东方(在我们的图表中右侧)。因此,奶牛 i 可以看到她面前奶牛的头顶(即奶牛 i+1、i+2 等),只要这些奶牛严格比奶牛 i 短。

请看这个例子:

        =
=       =
=   -   =         Cows facing right -->
=   =   =
= - = = =
= = = = = =
1 2 3 4 5 6 

奶牛 #1 可以看到奶牛 #2、3、4 的发型 奶牛#2看不到奶牛的发型 奶牛#3可以看到奶牛#4的发型 奶牛#4 看不到奶牛的发型 奶牛#5可以看到奶牛6的发型 奶牛#6根本看不到奶牛!

c我表示从奶牛 i 可以看到其发型的奶牛数量;请计算 C 的总和1通过cN.对于此示例,期望的答案是 3 + 0 + 1 + 0 + 1 + 0 = 5。

输入描述

第 1 行:奶牛数量,N
2号线...N+1:行 i+1 包含一个整数,该整数是奶牛 i 的高度。

输出描述

第 1 行:一个整数,它是 c 的总和1通过cN.

用例输入 1

6
10
3
7
4
12
2

用例输出 1

5

这道题虽然是一个简单的单调栈,但对于它到底为什么要用单调栈可以求出结果却疑惑了挺久;

这道题求的不是这个数能看见多少给数;而是这个数能被多少给数看见

#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
#define int long long
const int N=1e7+7;
int a[N];
signed main(){
    int sum=0;
        int n;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
           stack<int> st;
    for(int i=0;i<n;i++){
        while(st.size()!=0&&st.top()<=a[i])  st.pop();
         sum+=st.size();//因为求的是这个数能被几个数看见;所以不能加这个数本身 
        st.push(a[i]);
         
    }
   cout<<sum;
    
           
           
           
       }

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值