[2022-3-5] OICLASS-USACO提高组模拟赛2 B: Cow Frisbee

题意

在一排奶牛中,对于每两头奶牛,如果两头奶牛之间没有奶牛比这两头高,则答案累加这两头奶牛的距离。

分析

设现在分析的奶牛为第 \(i\) 头,它向左扔出了一个飞盘,显然它的飞行高度为奶牛的高度。飞盘不断飞行,直到有一头奶牛的身高大于它的飞行高度,此时飞盘停下。那么这头奶牛向左扔飞盘对答案的贡献就是飞盘经过的所有奶牛到他的距离之和。

实现

维护一个单调栈,每次循环进入一个数 \(a_i\) ,就向前不断寻找直到找到一个 \(b_i > a_i\) , 此时最终答案加上\(i - b_i + 1\)

AC code

#include<iostream>
#include<cstdio>
#include<stack>
using namespace std;
long long a[300005];
stack<long long>s;
int main(){
    long long n;
    cin>>n;
    for (int i=1;i<=n;i++){
        cin>>a[i];
    }
    long long ans=0;
    for (int i=1;i<=n;i++){
        while(!s.empty()&&a[s.top()]<a[i]){
            ans+=i-s.top()+1;
            s.pop();
        }
        if (!s.empty()){
            ans+=i-s.top()+1;
        }
        s.push(i);
    }
    cout<<ans;
    return 0;
}

End.

posted @ 2022-03-09 16:49  includeCPP  阅读(71)  评论(0)    收藏  举报