codevs 1531 山峰
题目描述 Description

Rocky山脉有n个山峰,一字排开,从西向东依次编号为1, 2, 3, ……, n。每个山峰的高度都是不一样的。编号为i的山峰高度为hi。

小修从西往东登山。每到一座山峰,她就回头观望自己走过的艰辛历程。在第i座山峰,她记录下自己回头能看到的山峰数si。

何谓“能看到”?如果在第i座山峰,存在j<k<i,hj<hk,那么第j座山峰就是不可见的。除了不可见的山峰,其余的山峰都是可见的。

回家之后,小修把所有的si加起来得到S作为她此次旅行快乐值。现在n座山峰的高度都提供给你了,你能计算出小修的快乐值吗?

 
输入描述 Input Description

第一行一个整数n(n<=15000)。

第i+1(1<=i<=n)行是一个整数hi(hi<=109)。

 
输出描述 Output Description

仅一行:快乐值。

 
样例输入 Sample Input

5

2

1

3

5

9

 
样例输出 Sample Output

5

 
数据范围及提示 Data Size & Hint

说明:s1=0, s2=1, s3=2, s4=1, s5=1。

维护一个单调递减的栈stack[]。

设当前元素为x,栈顶元素为k,栈顶指针为top,ans为到目前为止所能看到的山峰总数

如果x<k,ans+=top,x入栈。这座山比栈顶存的山低,那么由于栈从底部到顶部递减,所以此时栈内有几座山,就能看到几座山。

如果x=k,ans+=top,这座山和栈顶的山高度相同,设栈顶能看到y座山,在这座山就能看到y+1座山(加上的是栈顶这座山),也就是栈内所有的山。

如果x>k,1、ans+=top这座山比栈顶的山高,由于栈从栈底到栈顶单调递减,所以这座山比栈内所有的山高,可以看到所有的山。

2、由于这座山很高,所以会遮挡后面的视线,所以要维护栈的单调性,也就是从栈顶开始,如果这座山比栈顶的山高,栈顶退栈,直至退到这座山比栈顶的山低为止,x再入栈。

由此可以看出,对于每一个位置,都可以看到当前栈内所有的山,所以直接枚举,ans+=top

#include<cstdio>
#include<iostream>
using namespace std;
int stack[],top;
int n,ans,x;
int init()//读入优化,也可以直接输入
{
int x=;char c=getchar();
while(c<''||c>'') c=getchar();
while(c>=''&&c<='') {x=x*+c-'';c=getchar();}
return x;
}
int main()
{
n=init();
for(int i=;i<=n;i++)
{
x=init();
ans+=top;
if(x<stack[top-]) stack[top++]=x;//这座山比栈顶的山低
else if(x>stack[top-])//这座山比栈顶的山高
{
while(top&&x>stack[top-]) top--;//维护单调性
stack[top++]=x;
}
}
printf("%d",ans);
}

codevs 1531 山峰的更多相关文章

  1. codevs 1531山峰

    传送门 1531 山峰  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond   题目描述 Description Rocky山脉有n个山峰,一字排开,从西向东 ...

  2. 山峰(codevs 1531)

    1531 山峰  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description Rocky山脉有n个山峰,一字排开,从 ...

  3. CODEVS 必做题:3149、2821、1531、3369、1230

    3149 爱改名的小融 2  时间限制: 2 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description Wikioi上有个人叫小融,他喜 ...

  4. codevs 3289 花匠

    题目:codevs 3289 花匠 链接:http://codevs.cn/problem/3289/ 这道题有点像最长上升序列,但这里不是上升,是最长"波浪"子序列.用动态规划可 ...

  5. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  6. codevs 1285 二叉查找树STL基本用法

    C++STL库的set就是一个二叉查找树,并且支持结构体. 在写结构体式的二叉查找树时,需要在结构体里面定义操作符 < ,因为需要比较. set经常会用到迭代器,这里说明一下迭代器:可以类似的把 ...

  7. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

  8. codevs 1080 线段树点修改

    先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...

  9. codevs 1228 苹果树 树链剖分讲解

    题目:codevs 1228 苹果树 链接:http://codevs.cn/problem/1228/ 看了这么多树链剖分的解释,几个小时后总算把树链剖分弄懂了. 树链剖分的功能:快速修改,查询树上 ...

随机推荐

  1. ASP.NET处理301重定向方法 带示例 (demo)

    System.Web.HttpContext.Current.Response.Status = "301 Moved Permanently"; System.Web.HttpC ...

  2. jQuery代码优化:事件委托篇

    推荐阅读原文:http://www.ituring.com.cn/article/467# 推荐11收藏 随着DOM结构的复杂化和Ajax等动态脚本技术的运用,事件委托自然浮出了水面.jQuery为绑 ...

  3. SQL Server 中的逻辑读与物理读

    首先要理解逻辑读和物理读: 预读:用估计信息,去硬盘读取数据到缓存.预读100次,也就是估计将要从硬盘中读取了100页数据到缓存. 物理读:查询计划生成好以后,如果缓存缺少所需要的数据,让缓存再次去读 ...

  4. MySQL用户无法登陆问题

    安装完MySQL后,我们通常添加拥有相应权限的普通用户用来访问数据库.在使用普通用户(假设为tom)本地登录数据库的时候,经常会出现无法登录的情况,但是从其他的mysql客户端却可以登录.在本地使用t ...

  5. Spring MVC - 配置Spring MVC

    写在前面的话: 现在开始一段新的学习历程:Spring MVC.还是按照原来的三步走学习模式(what.why.how)进行讲解. 1.Spring MVC是什么(what) Spring MVC属于 ...

  6. 烂泥:puppet添加带密码的用户

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 前一篇文章,我们介绍了有关puppet3.7的安装与配置,这篇文章我们再来介绍下如何利用puppet添加带密码的用户. 要通过puppet添加带密码的用 ...

  7. iOS 读取相册二维码,兼容ios7(使用CIDetector 和 ZXingObjC)

    ios从相册读取二维码,在ios8以上,苹果提供了自带的识别图片二维码的功能,这种方式效率最好,也是最推荐的,但是如果你的系统需要向下兼容ios7,就必须用其他方式. 这里我选择的是 ZXingObj ...

  8. linux下使用Apache+php实现留言板功能的网站

    一.首先我们的linux服务器上要安装Apache和php 请参考:http://www.cnblogs.com/dagege/p/5949620.html 二.关闭防火墙服务,关闭selinux 请 ...

  9. PHPCMS如何开启手机站点

    现在手机端用户增长急速增长,看天猫今年双十一,有47%交易是移动端交易的,所以手机功能已逐渐替代电脑的功能,使用手机上网已经成为了互联网新的趋势,很多客户以及站长都希望手机能够访问自己的网站,那么今天 ...

  10. AngularJS服务

    在使用AngularJS的路由管理和控制视图加载的时候,当新的视图加载进来,原有视图的控制器会被销毁,这是出于内存占用和性能的考虑.服务提供了一种能在应用的整个生命周期内保持和共享数据的方法,它能够在 ...