[USACO06NOV]糟糕的一天Bad Hair Day

一些農民約翰的N頭牛(1≤N≤80,000)頭髮不好!由於每頭母牛都對自己的髮型很敏感,因此FJ想要計算能夠看到其他母牛頭頂的其他母牛的數量。
每頭牛都有一個特定的高度hi(1≤hi≤1,000,000,000),站在一排朝東的牛羣中。因此,只要這些奶牛嚴格比奶牛矮,i就可以看到奶牛頭頂上的奶牛(即母牛i + 1,i + 2等等)。

考慮每個點對答案的貢獻。
設他右邊比他高的第一個點爲k,點i對答案的貢獻爲 k-i-1。
答案即爲求 kii1(1<=i<=n)
找到他右邊第一個比他高的點,我們倒序就變成了找左邊比他高的點,維護單調下降的單調棧即可。

#include<bits/stdc++.h>
using namespace std;

const int MAXN=3e5+5;
const int INF=2147483647;

int top=0,n;
struct data{
    int val,tim;
    data(int a=0,int b=0){
        val=a,tim=b;
    }
}sta[MAXN];

int a[MAXN],pos[MAXN];

int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    a[n+1]=INF;
    for(int i=n+1;i>=1;i--){
        data tem(a[i],i);
        while(top&&sta[top].val<tem.val){
            top--;
        }
        pos[i]=sta[top].tim;
        sta[++top]=tem;
    }
    long long ans=0;
    for(int i=1;i<=n;i++)ans+=pos[i]-i-1;
    printf("%lld\n",ans);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章