题目链接:http://poj.org/problem?id=3250
题意:一群高度不同的牛从左到右排开,每头牛只能看见它右边的比它矮的牛的发型,若遇到一头高度大于或等于它的牛,则无法继续看到这头牛后面的其他牛。求所有的牛能够看见发型总数。
思路:考虑单调递减队列,即计算连续递减长度的问题,高度递减的时候就全部进栈,来个高个子则将堆栈中的低于高个子的全部弹出,我们不求当前牛向右能看到几头牛,我们求当前牛向左数能被几头牛看到,而这个信息刚好就是单调递减栈内元素的数量减一(减一减的是当前牛,也就是自己不能看到自己),top的值表示当前牛的位置左边有几头牛能看到它,我们把每头牛的top值加起来就是所求的答案(统计top写在了入栈前面,可以省略减一的操作)。
#include<stdio.h>
#include<algorithm>
#define ll long long
using namespace std;
const int N = 800090;
ll top, n, ans;
ll h, stk[N];
int main()
{
scanf("%lld",&n);
for(int i = 1; i <= n; i++)
{
scanf("%lld",&h);
while(top > 0 && h >= stk[top]) top--;
ans += top;
stk[++top] = h;
}
printf("%lld\n",ans);
return 0;
}