[jzoj 1264][ luogu 2866][USACO06NOV]糟糕的一天Bad Hair Day {單調棧/雙端佇列}

NO IMAGE

題目

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