洛谷 P1823 [COI2007] Patrik 音乐会的等待
洛谷 P1823 [COI2007] Patrik 音乐会的等待
题目描述
N个人正在排队进入一个音乐会。人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人。队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么他们是可以互相看得见的。
写一个程序计算出有多少对人可以互相看见。
输入格式
输入的第一行包含一个整数N (1 ≤ N ≤ 500 000), 表示队伍中共有N个人。
接下来的N行中,每行包含一个整数,表示人的高度,以毫微米(等于10的-9次方米)为单位,每个人的调度都小于2^31毫微米。这些高度分别表示队伍中人的身高。
输出格式
输出仅有一行,包含一个数S,表示队伍中共有S对人可以互相看见。
输入输出样例
输入 #1复制
输出 #1复制
说明/提示
数据制作: @w
2018.6.29添加3组数据
题解:
首先看到这题,一个绝对暴力的思路是一一枚举所有组合,然后对于每一个组合,判断一下这俩人是不是可以互相看见。然后累加ans。
肯定是T了,别想了。
但是我们可以通过刚刚的暴力思路进行画图模拟来得出一些更深刻的结论:显然地,如果从某一个人开始向右查找,碰到一群比他矮的,那么这些比他矮的和他自己就是合法的对。但是如果突然碰到一个比他高的,那即使后面还有若干的人比他矮,那也GG,因为这个高的阻挡住了所有的视线。
恍然发现要维护一个具有单调性的队列。于是我们考虑单调队列/单调栈,这道题用单调队列是不行的,因为单调队列是一个先进先出的数据结构,显然和本题题意不符。所以我们用单调栈再考虑一下:我们从队列的第一个人开始,维护一个单调递减的栈,当一个新的元素入栈的时候,显然,他可以看到当前在栈中所有比他矮的人,那就开始按单调栈的操作逐一弹栈,然后一直更新答案。这道题的思路就出来了。
如此写完,WA。
原因有两个:
第一个,如果碰到和其身高相等的咋办?
新开一个变量来记录有几个(包括自己)相等的。同时累计答案,最后再把所有相等的压回去即可。
第二个,注意,如果比他矮的和相等的都弹掉之后,栈还不为空,那么还要加上1.为什么呢?因为如果这个人是比他高的第一个人,那么他俩还是可以互相看到的,而这个人后面的就不行了。
开写,TLE三个点(超级数据)
为啥子会T呢?
这三个数据之所以区别于其他的数据,就是因为特殊构造了很多相等的人。按照我们刚才的思路,统计完了再一一压回去,实在是太慢!所以我们考虑在弹栈的时候累计,最后一起压回去。具体是,开一个二元组,第一维统计身高,第二维统计这个身高的人数,这样在每次弹栈的时候就可以搞很多个人,在某种程度上(可能只针对这3组故意构造的数据)优化了时间。
代码:
#include<stack>
#include<cstdio>
using namespace std;
typedef pair<int,int>par;
typedef long long ll;
ll ans;
int n;
stack<par>s;
int main()
{
scanf("%d",&n);
while(n--)
{
int x;
scanf("%d",&x);
par p=make_pair(x,1);
while (!s.empty()&&x>=s.top().first)
{
if (s.top().first==x)
p.second+=s.top().second;
ans+=s.top().second;
s.pop();
}
if (!s.empty())
ans++;
s.push(p);
}
printf("%lld",ans);
return 0;
}
洛谷 P1823 [COI2007] Patrik 音乐会的等待的更多相关文章
- 洛谷P1823 [COI2007] Patrik 音乐会的等待(单调栈+二分查找)
洛谷P1823 [COI2007] Patrik 音乐会的等待(单调栈+二分查找) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1333275 这个题不是很 ...
- 洛谷 P1823 [COI2007] Patrik 音乐会的等待 题解
P1823 [COI2007] Patrik 音乐会的等待 题目描述 N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相 ...
- 洛谷P1823 [COI2007] Patrik 音乐会的等待
https://www.luogu.org/problemnew/show/P1823 自己只会一个log的 设取的人的位置分别是l,r(l<r) 这个做法大概是考虑枚举r,设法对于每个r求出有 ...
- 洛谷 1823 [COI2007] Patrik 音乐会的等待
[题解] 维护一个单调栈即可. 但是因为有相同身高的存在,所以要稍微考虑下相同身高的处理.因为这个卡了一下下QAQ... #include<cstdio> #include<algo ...
- P1823 [COI2007] Patrik 音乐会的等待 单调栈 洛谷luogu
题目描述 N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么他们是可以互相看得见的. ...
- [COI2007] Patrik 音乐会的等待 (单调栈,模拟)
题目描述 N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么他们是可以互相看得见的. ...
- luoguP1823 [COI2007] Patrik 音乐会的等待
题目描述 N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么他们是可以互相看得见的. ...
- [COI2007] Patrik 音乐会的等待 单调栈
Code: #include<cstdio> #include<algorithm> #include<iostream> #include<cstring& ...
- [洛谷P1823]音乐会的等待 题解(单调栈)
[洛谷P1823]音乐会的等待 Description N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没 ...
随机推荐
- Phoenix |安装配置| 命令行操作| 与hbase的映射| spark对其读写
Phoenix Phoenix是HBase的开源SQL皮肤.可以使用标准JDBC API代替HBase客户端API来创建表,插入数据和查询HBase数据. 1.特点 1) 容易集成:如Spark,Hi ...
- Unity开发实战探讨-资源的加载释放最佳策略
注:本文中用到的大部分术语和函数都是Unity中比较基本的概念,所以本文只是直接引用,不再详细解释各种概念的具体内容,若要深入了解,请查阅相关资料. Unity的资源陷阱 游戏资源的加载和释放导致的内 ...
- java基本类型包装类之间的值比较问题
废话不多说,先看代码 Integer a = 2;Integer b = 2;if(a==b){ System.out.println("相等");}else{ System.ou ...
- set -x 与 set +x
set -x 与 set +x 在liunx脚本中可用set -x就可有详细的日志输出.免的老是要echo了 下面的网上搜来的用法. 用于脚本调试.set是把它下面的命令打印到屏幕set -x 是开启 ...
- Zookeeper 到底能帮我们解决哪些问题?
Zookeeper 从设计模式角度来看,是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper 就将负责通 ...
- Clickhouse单机部署以及从mysql增量同步数据
背景: 随着数据量的上升,OLAP一直是被讨论的话题,虽然druid,kylin能够解决OLAP问题,但是druid,kylin也是需要和hadoop全家桶一起用的,异常的笨重,再说我也搞不定,那只能 ...
- IDEA帮助文档快捷键ctrl+q 查看类 方法 变量 帮助文档 注释 快捷键
IDEA查看类 成员变量 局部变量注释快捷键,Ctrl +Q 查看帮助文档 实际项目中,通常一个类中的代码都不少,而且有很多的变量 那么如何快速知道这个变量的一些信息,比如类型,定义? 比如在第50 ...
- 绑定 Binding Path=.,Binding.,Binding Source={StaticResource ResourceKey="Hello"} xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:sys="clr-namespace:System;assembly=mscorlib" <Window.Resources> <Style Targ ...
- SQLServer 跨服务器链接 Access数据库
最近做了一个链接Access的实例,记录一笔. 如果你的Access数据库文件和SQLServer数据库在同一服务器上,可直接在数据库手动创建数据库链接 步骤如下: 打开新建链接,给你的链接起一个顺眼 ...
- Filco圣手二代双模蓝牙机械键盘连接方法
转自:https://www.cnblogs.com/goldenSky/p/11437780.html 常规方法 确认键盘的电源接通. 同时按下「Ctrl」+「Alt」+「Fn」执行装置切换模式.配 ...