Poj 3250 单调栈
1、Poj 3250 Bad Hair Day
2、链接:http://poj.org/problem?id=3250
3、总结:单调栈
题意:n头牛,当i>j,j在i的右边并且i与j之间的所有牛均比i矮,i就可看到j。i可看到的所有牛数记为ai,求S(ai),(1<=i<=n)。
转化一下,求j可以被多少牛看到。这样就直接单调栈,求从j往前单调递增的数量。
#include<iostream> #include<cstring> #include<cmath> #include<queue> #include<stack> #include<algorithm> #include<cstdio> using namespace std; #define LL long long #define INF 0x3f3f3f3f int main() { stack<int>q; int n,a; LL sum; while(scanf("%d",&n)!=EOF) { sum=0; scanf("%d",&a); q.push(a); for(int i=1;i<n;i++){ scanf("%d",&a); while(!q.empty()&&q.top()<=a){ q.pop(); } sum+=q.size(); q.push(a); } printf("%lld\n",sum); while(!q.empty()){ q.pop(); } } return 0; }