题目来源: http://poj.org/problem?id=3250
题意
有n头牛,身高不一致,从左往右排列开,每头牛都可以看到其他高度比他低的牛,当然:3,5,4这样不行,统计一下每头牛可以看到的其他牛的总和。
思路
利用单调栈去维护一个从左往右单调递减的区间,以O(n)的复杂度来解决这到题。
模拟一下样例:
10 3 7 4 12 2 。
输入10,3,也就是一号牛可以看到2号牛,然后输入7,因为7和3比较,要使得成为一个单调递减的序列,就把3去了,序列变成了10,7,此时的一号牛同样可以看到2号牛,然后在输入4,序列成了10,7,4,一号牛和二号牛都可以看到三号牛,以此类推。
代码
#include<stdio.h>
int a[80000+10];
int main()
{
long long sum=0;
int n,l=-1;
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
int x;
scanf("%d",&x);
while(l>=0&&x>=a[l])
l--;
a[++l]=x;
sum+=l;
}
printf("%lld\n",sum);
}