1660: [Usaco2006 Nov]Bad Hair Day 乱发节

Description

Input

* Line 1: 牛的数量 N。

 * Lines 2..N+1: 第 i+1 是一个整数,表示第i头牛的高度。

Output

* Line 1: 一个整数表示c[1] 至 c[N]的和。

Sample Input

6
10
3
7
4
12
2


输入解释:

六头牛排成一排,高度依次是 10, 3, 7, 4, 12, 2。

Sample Output

5

3+0+1+0+1=5
 
麻麻再也不用担心我不会写单调栈了,用栈记录当前点距第一个大于等于它的数,注意是大于等于,
还要把n+1设置成无穷大。。。。
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<cstring>
 6 #define MAX 80010
 7 #define ll long long
 8 #define inf 6000000000
 9 using namespace std;
10 ll f[MAX];int sta[MAX],b[MAX],top=0;
11 int main(){
12     int n;
13     scanf("%d",&n);
14     for(int i=1;i<=n;i++)scanf("%lld",&f[i]);
15     f[n+1]=inf;
16     for(int i=1;i<=n+1;i++){
17         while(top>0&&f[sta[top]]<=f[i]){b[sta[top]]=i-sta[top]-1;top--;}
18         sta[++top]=i;
19     }
20     ll ans=0;
21     for(int i=1;i<=n;i++)ans+=b[i];
22     printf("%lld",ans);
23 }
View Code

 

posted @ 2015-10-03 12:25  HTWX  阅读(114)  评论(0编辑  收藏  举报