原题:POJ 3058发型糟糕的一天
思路:用一个单调递减的栈保存奶牛的身高,从前往后依次遍历奶牛,每次遍历时统计当前可以看到的奶牛数,维护栈的单调性。
需要注意的是最终的结果是超过int范围的,相同身高的奶牛是无法看到头顶的。
代码:
#include <iostream>
#include <stack>
using namespace std;
#define MAX 80010
unsigned int data[MAX];
int main()
{
int N;
cin >> N;
for (int i = 0; i < N; i++) cin >> ::data[i];
long long ans = 0;
stack<unsigned int> st;
for (int i = 0; i < N; i++)
{
while (!st.empty() && st.top() <= ::data[i]) st.pop();
ans += st.size();
st.push(::data[i]);
}
cout << ans;
return 0;
}