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,等等),只要那些牛的高度严格小于她的高度。
每一头牛 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头牛的高度。
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 }