poj 3250 Bad Hair Day(单调队列)
题目链接:http://poj.org/problem?id=3250
思路分析:题目要求求每头牛看见的牛的数量之和,即求每头牛被看见的次数和;现在要求如何求出每头牛被看见的次数?
考虑到对于某头特定的牛来说,看见它的牛一定在它的左边,另外其高度应该大于该牛的高度,所以只需要计算在其左边并高度大于它的牛的数目即可;
考虑构建一个栈,在某头牛入栈时,弹出栈中高度小于它的牛,剩下的牛高度大于它,此时计算栈的长度就可以得到该牛被看见的次数。
代码如下:
#include<iostream> #include<stack> using namespace std; int main() { int n; int ans = 0; unsigned long height; stack<unsigned long>S; scanf( "%d", &n ); scanf( "%d", &height ); S.push( height ); for ( int i = 1; i < n; i++ ) { scanf( "%d", &height ); while ( !S.empty() && S.top() <= height ) S.pop(); ans = ans + S.size(); S.push( height ); } while ( !S.empty() ) S.pop(); printf( "%u\n", ans ); return 0; }
算法复杂度: O(N)