题目
农民John的某 N 头奶牛 (1 <= N <= 80,000) 正在过乱头发节!由于每头牛都意识到自己凌乱不堪的发型,FJ 希望统计出能够看到其他牛的头发的牛的数量。每一头牛 i有一个高度 h[i] (1 <= h[i] <= 1,000,000,000)而且面向东方排成一排(在我们的图中是向右)。因此,第i头牛可以看到她前面的那些牛的头,(即i+1, i+2,等等),只要那些牛的高度严格小于她的高度。
每一头牛 i有一个高度 h[i] (1 <= h[i] <= 1,000,000,000)而且面向东方排成一排(在我们的图中是向右)。因此,第i头牛可以看到她前面的那些牛的头,(即i+1, i+2,等等),只要那些牛的高度严格小于她的高度。
Input
Line 1: 牛的数量 N。
Lines 2..N+1: 第 i+1 是一个整数,表示第i头牛的高度。
Output
Line 1: 一个整数表示c[1] 至 c[N]的和
解题思路
将读入的数和之前队列中的数比较,如果比前面的数大,就将前面的数逐个删掉,否则压入队列,然后逐渐累加结果
代码
#include<cstdio>
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);
#include<deque>
using namespace std;
deque<int>que;
int n,w; long long ans;
int main()
{
// fre(badhair);
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&w);
if (que.empty()) que.push_front(w);
else {
while (que.size()&&w>=que.back()) que.pop_back();
ans+=que.size();
que.push_back(w);
}
}
printf("%lld",ans);
}