题目描述

N个人正在排队进入一个音乐会。人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人。队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么他们是可以互相看得见的。

写一个程序计算出有多少对人可以互相看见。

输入输出格式

输入格式:

输入的第一行包含一个整数N (1 ≤ N ≤ 500 000), 表示队伍中共有N个人。

接下来的N行中,每行包含一个整数,表示人的高度,以毫微米(等于10的-9次方米)为单位,每个人的调度都小于2^31毫微米。这些高度分别表示队伍中人的身高。

输出格式:

输出仅有一行,包含一个数S,表示队伍中共有S对人可以互相看见。

输入输出样例

输入样例#1: 复制

7
2
4
1
2
2
5
1
输出样例#1: 复制

10

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

#include<bits/stdc++.h>
using namespace std; stack<long long>stk;//存元素
stack<long long>num;//存相同元素数量 (两个栈同步)
stk 9 6 (栈顶)
num 3 2 (栈顶)
备注 (栈中有·3个9) (2个6)  
int n;
long long ans,tmp; //ans 累加器 int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%lld",&tmp);
while(!stk.empty() && stk.top() < tmp) //如果栈不为空 且栈顶元素比tmp小 那么看得到栈顶元素
{
stk.pop();
ans += num.top();
num.pop();
}
if(stk.empty())//若元素栈是空的 直接塞进去就好了
{
stk.push(tmp);
num.push();
}else//栈不是空的
{
if(tmp != stk.top())//栈顶元素与读到的元素不相同的情况
{
ans+=;//两人紧挨 肯定能看得到对方 故 累加器加1
stk.push(tmp);
num.push();
}else//栈顶元素与读到的元素相同的时候
if(stk.size() == ) //仅有一个元素
{
ans+=num.top();
int u = num.top();
num.pop();
num.push(u+);
}
else//栈顶元素与读到的元素相同的时候 且 有多个元素
{
ans += num.top();
int u = num.top();
num.pop();
ans += ;
num.push(u+);
}
}
}
printf("%lld\n",ans);
return ;
}

分情况讨论

(1).栈为空:直接把新元素压入就好

(2).栈不为空:1.栈顶元素<tmp

                栈顶元素都看得到

                累加器+=栈顶元素个数

                弹出栈顶元素

        2.栈顶元素=tmp

                <1> 栈中仅有一个元素

                          都看得到

                          stk不变;   tmp的值(唯一的元素的值)+1

                <2>栈中仍有多个元素

                          都看得到

                          stk不变;   tmp的值(唯一的元素的值)+1

                          同时也相当于与相邻元素紧挨 ans+1

        3.栈顶元素>tmp

                由于紧挨着 ans+1

备注:

  1.从上到下依次特判 调整顺序不可以

  2.开long long

  3.注意ans是+1还是+num.tpo();   

                          

  

P1823 [COI2007] Patrik 音乐会的等待 单调栈 洛谷luogu的更多相关文章

  1. 洛谷P1823 [COI2007] Patrik 音乐会的等待(单调栈+二分查找)

    洛谷P1823 [COI2007] Patrik 音乐会的等待(单调栈+二分查找) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1333275 这个题不是很 ...

  2. [COI2007] Patrik 音乐会的等待 (单调栈,模拟)

    题目描述 N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么他们是可以互相看得见的. ...

  3. [COI2007] Patrik 音乐会的等待 单调栈

    Code: #include<cstdio> #include<algorithm> #include<iostream> #include<cstring& ...

  4. 洛谷 P1823 [COI2007] Patrik 音乐会的等待

    洛谷 P1823 [COI2007] Patrik 音乐会的等待 洛谷传送门 题目描述 N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A ...

  5. 洛谷 P1823 [COI2007] Patrik 音乐会的等待 题解

    P1823 [COI2007] Patrik 音乐会的等待 题目描述 N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相 ...

  6. Patrik 音乐会的等待 单调栈的迷茫回忆

    STL 一定要学好 一定要学好,一定要学好!!! 题目链接:https://www.luogu.org/problemnew/show/P1823 我们需要单向查找:用单调栈: 思路:维护一个身高单调 ...

  7. 洛谷P1823 [COI2007] Patrik 音乐会的等待

    https://www.luogu.org/problemnew/show/P1823 自己只会一个log的 设取的人的位置分别是l,r(l<r) 这个做法大概是考虑枚举r,设法对于每个r求出有 ...

  8. 【洛谷P1823】音乐会的等待 单调栈+二分

    题目大意:给定一个长度为 N 的序列,定义两个数 \(a[i],a[j]\) 相互看得见,意味着 \(\forall k\in [i+1,j-1],a[k]\le a[i],a[k]\le a[j]\ ...

  9. luoguP1823 [COI2007] Patrik 音乐会的等待

    题目描述 N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么他们是可以互相看得见的. ...

随机推荐

  1. mysql 8小时超时设置

    1.打开MySQL配置文件 2.添加 interactive_timeout=31536000wait_timeout=31536000 3.重新启动服务 打开MySQL命令行界面查看设置是否成功

  2. Tomcat报failed to parse the expression [${xxx}]异常(javax.el.ELException)的解决方法

    Tomcat 7 'javax.el.ELException' 的解决方式tomcat 7对EL表达式的语法要求比较严格,例如"${owner.new}"因包含关键字new就会导致 ...

  3. 有道云笔记链接——JAVA面向对象的学习

     http://note.youdao.com/noteshare?id=cf39a0e493a6b3c7ad5d22204a7e7843

  4. Harbor 搜索镜像及查看 tag

    在我们搭建完 Harbor 后: https://www.cnblogs.com/klvchen/p/9482153.html 如果想要通过 API 获取 Harbor 上面的镜像及 tag 可以使用 ...

  5. 【读书笔记】iOS-单元测试工具

    一,单元测试工具. 1,OCUnit 苹果自带的. 2,GHUnit GHUnit是Objective-C语言里的另外一种单元测试工具. GHUnit- https://github.com/gh-u ...

  6. React 入门学习笔记整理(六)—— 组件通信

    1.父子组件通信 1)父组件与子组件通信,使用Props 父组件将name传递给子组件 <GreateH name="kitty"/> 子组件通过props接收父组件的 ...

  7. docker第一章:docker核心概念及centos6下安装

    Docker三大核心概念 镜像 容器 仓库 镜像 docker镜像类似于虚拟机镜像,可以将它理解为一个面向Docker引擎的只读模板,包含了文件系统. 容器 1.容器是从镜像创建的应用运行实例,容器和 ...

  8. 在Centos下面FTP映射方案

    前两天公司要在一台Centos的机子上,把一些文件定时备份到另外一台ftp服务器上, 在Linux系统中,mount是不支持直接挂在"ftp://192.168.1.1/backup&quo ...

  9. PullToRefreshGridView上拉刷新,下拉加载

    PullToRefreshGridView上拉刷新,下拉加载 布局: <?xml version="1.0" encoding="utf-8"?> ...

  10. 故障小记录:yum 安装报错File "/usr/bin/yum", line 30 except KeyboardInterrupt, e:

    发生原因: 由于yum是基于python的,之前安装我python3,当我修改了python命令的指向到python3之后就会发生这样的问题. 解决办法: 由于我当初想到可能以后还需要python2, ...