问题 A: [Usaco2006 Mar]Mooo 奶牛的歌声

 

几个月前在学校zxr dalao讲过单调栈,所以对于单调栈还是有一些了解,这道题根据题意,声音只能被身高大于它的奶牛听见,也就是说,每一个奶牛只能听见身高比他矮的奶牛的声音。

所以我们需要维护一个单调递减的单调栈,遇到一个比它高的奶牛就将其弹出栈,而那头高的奶牛听到的声音就是被弹出栈的奶牛声音的总和。

 

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+7;
int n;
int h[maxn];
int v[maxn];
int sta[maxn];
int ans[maxn];
int top;
int maxx;
void dandiaozhan()
{
    for(int i=1;i<=n;i++)
    {
        while(top&&h[i]>h[sta[top]])
        {
            ans[i]+=v[sta[top]];
            top--;
        }
        sta[++top]=i;
    }
    top=0;
    for(int i=n;i>=1;i--)
    {
        while(top&&h[i]>h[sta[top]])
        {
            ans[i]+=v[sta[top]];
            top--;
        }
        sta[++top]=i;
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d",&h[i],&v[i]);
    }
    dandiaozhan();
    for(int i=1;i<=n;i++)
    {
        maxx=max(ans[i],maxx);
    }
    printf("%d",maxx);
    return 0;
}

 

posted @ 2019-06-09 19:58  JBLee  阅读(186)  评论(0编辑  收藏  举报