[JZOJ1264] 乱头发节

Description

  农民John的某 N 头奶牛 (1 <= N <= 80,000) 正在过乱头发节!由于每头牛都意识到自己凌乱不堪的发型,FJ 希望统计出能够看到其他牛的头发的牛的数量。   每一头牛 i有一个高度 h[i] (1 <= h[i] <= 1,000,000,000)而且面向东方排成一排(在我们的图中是向右)。因此,第i头牛可以看到她前面的那些牛的头,(即i+1, i+2,等等),只要那些牛的高度严格小于她的高度。
       每一头牛 i有一个高度 h[i] (1 <= h[i] <= 1,000,000,000)而且面向东方排成一排(在我们的图中是向右)。因此,第i头牛可以看到她前面的那些牛的头,(即i+1, i+2,等等),只要那些牛的高度严格小于她的高度。

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

Sample Output

  5

Summary

  维护一条单调栈,如果出现了比栈中高的奶牛,那么这头奶牛就看不到之后的的奶牛,对答案失去了贡献。

 1 #include<cstdio>
 2 using namespace std;
 3 int n,tot;
 4 long long a[100000],d[100000],ans;
 5 int main()
 6 {
 7     scanf("%d",&n);
 8     for (int i=1;i<=n;i++)
 9     {
10         scanf("%d",&a[i]);
11         while (tot!=0&&d[tot]<=a[i])
12             tot--;
13         d[++tot]=a[i];
14         ans=ans+tot-1;
15     }
16     printf("%lld",ans);
17 }
View Code

 

posted @ 2018-07-17 21:17  kasiruto  阅读(303)  评论(0编辑  收藏  举报