【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); }