P1823 Patrik 音乐会的等待
题目描述
N个人正在排队进入一个音乐会。人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟进行谈笑风生。队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么他们是可以互相看得见的。
写一个程序计算出有多少对人可以互相看见。
输入输出格式
输入格式:
输入的第一行包含一个整数N (1 ≤ N ≤ 500 000), 表示队伍中共有N个人。
接下来的N行中,每行包含一个整数,表示人的高度,以毫微米(等于10的-9次方米)为单位,每个人的调度都小于2^31毫微米。这些高度分别表示队伍中人的身高。
输出格式:
输出仅有一行,包含一个数S,表示队伍中共有S对人可以互相看见。
数据范围 \(n<=500,000\) 限定le我们必须要使用\(o(N)\)算法
那我们来简单的分析一下。
对于在一个高人之前的,naive的人,对于这个高人之后的人,就没有什么影响le
这就启示我们需要一个在线性时间内维护单调性的数据结构不就是单调栈么? 说的这么麻烦
我们维护一个从栈顶到栈底单调递增的单调栈
在一个元素进栈的时候,他有可能弹出去几个比他naive的人,他就可以和这些人交流人生经验,如果维护好单调性后,没有入栈前,栈非空,就可以和栈顶的兄die一起van游戏
就是这样了。
然后有可能有重复身高的人,要处理一下
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
const int manx=501000;
struct node
{
int num;//相同身高的人的个数
int hig;//高度
bool operator <= (const node &a)const
{
return hig <= a.hig;
}
bool operator == (const node &a)const
{
return hig==a.hig;
}
void operator += (const node &a)
{
num+=a.num;
return ;
}
};
node stack[manx];
int top;
int ans=0;
void push(int n)
{
node pas;
pas.hig=n;pas.num=1;
while(stack[top]<=pas&&top)
{
ans+=stack[top].num;//谈笑风生
if(stack[top]==pas)//相同身高的人
pas+=stack[top];//合并
top-=1;
}
if(top) ans+=1;//和栈顶的兄die交流
stack[++top]=pas;
}
int main()
{
int n;
scanf("%d",&n);
int a;
for(int i=1;i<=n;i++)
{
scanf("%d",&a);
push(a);//入栈
}
printf("%d",ans);//答案
}
P1823 Patrik 音乐会的等待的更多相关文章
- [COI2007] [luogu P1823] Patrik 音乐会的等待 解题报告 (单调栈)
题目链接:https://www.luogu.org/problemnew/show/P1823 题目: N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人. ...
- 洛谷 P1823 [COI2007] Patrik 音乐会的等待
洛谷 P1823 [COI2007] Patrik 音乐会的等待 洛谷传送门 题目描述 N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A ...
- 洛谷 P1823 [COI2007] Patrik 音乐会的等待 题解
P1823 [COI2007] Patrik 音乐会的等待 题目描述 N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相 ...
- 洛谷P1823 [COI2007] Patrik 音乐会的等待(单调栈+二分查找)
洛谷P1823 [COI2007] Patrik 音乐会的等待(单调栈+二分查找) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1333275 这个题不是很 ...
- P1823 [COI2007] Patrik 音乐会的等待 单调栈 洛谷luogu
题目描述 N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么他们是可以互相看得见的. ...
- 洛谷P1823 [COI2007] Patrik 音乐会的等待
https://www.luogu.org/problemnew/show/P1823 自己只会一个log的 设取的人的位置分别是l,r(l<r) 这个做法大概是考虑枚举r,设法对于每个r求出有 ...
- [COI2007] Patrik 音乐会的等待 (单调栈,模拟)
题目描述 N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么他们是可以互相看得见的. ...
- Patrik 音乐会的等待 单调栈的迷茫回忆
STL 一定要学好 一定要学好,一定要学好!!! 题目链接:https://www.luogu.org/problemnew/show/P1823 我们需要单向查找:用单调栈: 思路:维护一个身高单调 ...
- luoguP1823 [COI2007] Patrik 音乐会的等待
题目描述 N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么他们是可以互相看得见的. ...
随机推荐
- 树莓派安装Raspbian系统以及相关配置(通过Windows)
1.准备 树莓派3B+(E14) 一张内存卡 (至少16G) 一个读卡器 普通电脑显示器,键盘,鼠标 2.操作系统烧制(下面的操作都是在Windows中操作,通过读开启读取内存卡) Raspbian系 ...
- Oracle基础篇--01数据库控制语言DCL
数据库控制语言,是用户对数据的权限控制语言. 通过GRANT语句进行赋权,通过REVOKE撤回权限.数据库的权限包括2种,一种是数据库系统权限,一种是数据库对象权限.在控制语言里面,存在2个概念, 1 ...
- window系统下SVN服务器和客户端的搭建和使用
SVN服务器下载地址: http://subversion.apache.org/packages.html 这里我选用VisualSVN server 服务端和 TortoiseSVN客户端搭配使用 ...
- visual stdio使用
现在转换使用visual stdio,因为很多和以前的快捷键不同,也不打算换了,这样可移动性应该更好吧. 1.注释代码, 首先按下ctrl + k,然后再按下ctrl + c 2.取消注释,首先按下c ...
- (转)shell解析命令行的过程以及eval命令
shell解析命令行的过程以及eval命令 本文说明的是一条linux命令在执行时大致要经过哪些过程?以及这些过程的大致顺序. 1.1 shell解析命令行 shell读取和执行命令时的大致操作过 ...
- 【Linux】Debian vim没有颜色的解决办法
vim /etc/vim/vimrc #查找到syntax on 启用,去掉前面的“ (引号). 保存ok 转载地址:http://www.th7.cn/system/lin/201404/525 ...
- stm32串口学习(二)
今天继续学习stm32的串口编程(利用库函数).上次我们说了串口的发送,这次我们说接收. 接收可以用查询的方法,也可以用中断.显然,工程中多用中断的方式,那么就来看看中断接收. 代码其实很简单,基本的 ...
- 在线编辑word文档 可保存到服务器
使用说明:该方法只在office xp 和 2003上 测试通过,2000及以下 版本没试. 注意:你要打开的服务器端的word文档要有写权限.iis要开起 web服务扩展中的webdav为允许 具体 ...
- Quartz使用(4) - Quartz监听器Listerner
1. 概述 Quartz的监听器用于当任务调度中你所关注事件发生时,能够及时获取这一事件的通知.类似于任务执行过程中的邮件.短信类的提醒.Quartz监听器主要有JobListener.Trigger ...
- php静态变量static
静态变量 function test() { static $a = 0; echo $a; $a++; } test(); test(); test();