【codevs1531】山峰

这个题很明显就是用栈嘛,如果一座山比之前所有的山峰都低,就不会影响后面的视线,直接加入栈,否则比它低的之后就都看不到了,所以弹出比它低的山峰

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long lo;
lo n,ans,shu[15010],sta[15010],head,tail;
int main()
{
    scanf("%lld",&n);
    for(int i=1;i<=n;i++)
        scanf("%lld",&shu[i]);
    head=tail=1; 
    sta[tail]=shu[1];//提前放进去
    for(int i=2;i<=n;i++)
    {
        if(sta[tail]>=shu[i])//如果当前山峰较矮,那么不影响看它后面的山峰看前面的山峰,直接加入栈 
            sta[++tail]=shu[i],ans+=tail-head;
        else//否则这座山峰会影响后面看山,因此所有高度比它小的它都能看到,但是它后面看不到,所以弹出高度比它低的山峰。 
        {
            ans+=tail-head+1;//前面都看得到 
            while(sta[tail]<shu[i]&&tail>0)
                tail--;
            sta[++tail]=shu[i];
        }
    }
    printf("%lld",ans);
}

 

posted @ 2017-10-27 10:03  那一抹落日的橙  阅读(188)  评论(0编辑  收藏  举报