[jzoj 1264][ luogu 2866][USACO06NOV]糟糕的一天Bad Hair Day {单调栈/双端队列}

题目

 农民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); 
}

猜你喜欢

转载自blog.csdn.net/qq_39897867/article/details/81105939
今日推荐