POJ3250Bad Hair Day

时间:2023-03-08 16:50:39
POJ3250Bad Hair Day

http://poj.org/problem?id=3250

题意 :  n个牛排成一列向右看,牛 i 能看到牛 j 的头顶,当且仅当牛 j 在牛 i 的右边并且牛 i 与牛 j 之间的所有牛均比牛 i 矮。 设牛 i 能看到的牛数为ni,求ni的和。

思路 : 表示一开始就想用数组去操作,结果说是会超时,问了别人的才知道原来要用栈啊,用栈保存,新的元素若是比栈顶元素大,就把栈里小于新元素的弹出栈

#include<cstdio>
#include<cstring>
#include<stack>
#include<iostream>
using namespace std ;
int main()
{
int n ;
scanf("%d",&n) ;
stack<long long>Q;
long long cnt = ;
int a;
scanf("%d",&a) ;
Q.push(a) ;
for(int i = ; i < n ; i++)
{
scanf("%d",&a) ;
while(!Q.empty()&&a>=Q.top())
{
Q.pop();
}
cnt += Q.size();
Q.push(a) ;
}
printf("%lld\n",cnt) ;
return ;
}