n个牛排成一列向右看,牛i能看到牛j的头顶,当且仅当牛j在牛i的右边并且牛i与牛j之间的所有牛均比牛i矮。 设牛i能看到的牛数为Ci,求∑Ci
求所有牛总共能看到多少牛,可以转化为:这n头牛共能被多少头牛看见。 当我们新加入一个高度值时,如果栈中存在元素小于新加入的高度值,那么这些小的牛肯定看不见这个高度的牛(那就看不见这头牛后边的所有牛)所以就可以把这些元素弹出。每次加入新元素,并执行完弹出操作后,栈中元素个数便是可以看见这个牛的数量 加一起就是ans
#include <iostream>
#include <stack>
using namespace std;
typedef long long ll;
ll ans;
int main(int argc, char const *argv[])
{
stack< int > s;
int n;cin>>n;
for(int i=0;i<n;i++)
{
int x;cin>>x;
while(!s.empty()&&s.top()<=x)
{
s.pop();
}
ans+=s.size();
s.push(x);
}
cout<<ans<<endl;
return 0;
}