洛谷P4198 楼房重建 题解
Part1.自己一开始是怎么想的
我一开始的想法是先考虑什么情况下是看不见的。
如果是 \(i < j\) 的话可以直接看 \(j\) 的斜率和 \(i\) 的斜率就是比较 \(\frac{h_i}{i}\) 的大小关系来判断。所以说我们是要单点修改一个点的斜率。我们要统计的东西很复杂,并没有想明白,然后不知道用什么来维护。
Part2.正解是怎样的
阅读题解可以得知一种线段树的写法。我们定义 \(len\) 表示一段区间内的可见建筑的个数。
抽象了一下问题:整个 \(1-n\) 的区间内,每一个大于上一个选了的必须选,小于等于上一个选了的必须不选,求最终的序列长度。
经过观察发现区间是固定的,大区间的答案是可合并的,修改是简单的,考虑线段树维护。
线段树中有两个值。一个存储区间最大\(len\),一个存储的是区间内的斜率最大值\(maxx\)。
考虑如何修改?直接修改,\(O(logn)\)。重点在于如何合并区间(pushup)。
现在考虑两个小区间,这两个小区间的\(len\) 和 \(maxx\) 是我们可以直接用的。可以发现,左区间的答案是可以直接继承的。现在我们只需要考虑右区间的答案。
我们是这么更新的 tree[u].len=tree[ls].len+pushup2(tree[ls].maxx,rs,mid+1,rt)
,我们发现,确实是直接继承的左儿子的答案。右儿子的答案就是递归算的。为什么要递归算呢?因为左边的数值实际上是会对右边的答案造成影响的,所以不能直接继承答案,要一点一点算出来左边的影响。传一个数值 \(lx\) 代表需要满足大于 \(lx\) 才能被看见。这个时候我们看 pushup 的核心分类讨论:
maxx<=lx
,结束a[l]>lx
,这时候可以剪枝,直接返 \(len_x\)l==r
,return a[l]>lx
- 定义 \(s_1\) 为左区间,\(s_2\) 为右区间。
- 若
s1.maxx <= lx
,return pushup(lx,s2,mid+1,r)
- 若
s1.maxx > lx
,return tree[u].len-tree[ls].len+pushup(lx,s1,l,mid)
要讲一下为什么是 tree[u].len-tree[ls].len
而不是 tree[rs].len
,因为这里的更新是第一次,但是 tree[u]
已经完成了更新,右区间会受到左区间的影响,我们剪掉这种形式就是对的。
修改就是 \(O(logn^2)\)的。
Part3.差在哪里,如何解决?
没有理清楚自己要干什么。没有想到这种东西是可以合并的,然后就用线段树维护。
解决方法:我积累到了这种思考方式和这种题目的解决办法,感觉就能够解决类似的问题。
Part4.编码的困难,调出来的错误
- 没有
- 有小的地方打错。
Part5.收获有什么
积累了这种类似的问题的解决方案,拿到这种修改查询的东西首先要理清楚自己要干什么,看他的等价问题是什么,然后思考是否可以合并,然后大胆假设,小心分讨!
Part6.时间主要花在哪里了
理解正解最后的减去和递归的pushup,这种还是见少了,要见多识广才能缩短时间。
洛谷P4198 楼房重建 题解的更多相关文章
- 洛谷 P4198 楼房重建 题解
题面 首先你要知道题问的是什么:使用一种数据结构,动态地维护以1为起点地最长上升子序列(把楼房的高度转化成斜率地序列)的长度: 怎么做?线段树! 我们在线段树上维护两个东西:1.这个区间内斜率的最大值 ...
- 洛谷P4198 楼房重建 (分块)
洛谷P4198 楼房重建 题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题, ...
- 洛谷P4198 楼房重建 单调栈+线段树
正解:单调栈+线段树 解题报告: 传送门! 首先考虑不修改的话就是个单调栈板子题昂,这个就是 然后这题的话,,,我怎么记得之前考试好像有次考到了类似的题目昂,,,?反正我总觉着这方法似曾相识的样子,, ...
- 洛谷P4198 楼房重建(线段树)
题意 题目链接 Sol 别问我为什么发两遍 就是为了骗访问量 这个题的线段树做法,,妙的很 首先一个显然的结论:位置\(i\)能被看到当且仅当\(\frac{H_k}{k} < \frac{H_ ...
- 洛谷P4198 楼房重建
题意:给定序列,每次修改一个值,求前缀最大值的个数. 解:线段树经典应用. 每个节点维护最大值和该区间前缀最大值个数. 发现我们不用下传标记,只需要合并区间. 需要实现一个函数int ask([l r ...
- 洛谷 P4198 楼房重建
思路 此题可转化为以下模型 给定序列\(a[1...n]\),支持单点修改,每次求区间单调栈大小 \(n,Q\le 10^5\) 区间单调栈是什么呢?对于一个区间,建立一个栈,首先将第一个元素入栈,从 ...
- 洛谷 P3905 道路重建 题解
P3905 道路重建 题目描述 从前,在一个王国中,在\(n\)个城市间有\(m\)条道路连接,而且任意两个城市之间至多有一条道路直接相连.在经过一次严重的战争之后,有\(d\)条道路被破坏了.国王想 ...
- 洛谷 P4198 楼房重建 线段树维护单调栈
P4198 楼房重建 题目链接 https://www.luogu.org/problemnew/show/P4198 题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上 ...
- 洛谷P1119-灾后重建-floyd算法
洛谷P1119-灾后重建 题目描述 给出\(B\)地区的村庄数NN,村庄编号从\(0\)到\(N-1\),和所有\(M\)条公路的长度,公路是双向的. 给出第\(i\)个村庄重建完成的时间\(t_i\ ...
- 洛谷P2832 行路难 分析+题解代码【玄学最短路】
洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...
随机推荐
- java重载-构造方法也存在重载-数据类型的提升
重载 1.一个类中不能声明多个相同的方法,属性. 2.上面的相同指的是方法名,参数列表相同.和返回值类型无关. 3.如果方法名相同,但是参数列表(个数,顺序,类型)不相同,会认为是不同的方法,在jav ...
- 浅说TCP状态机制
本文分享自天翼云开发者社区<浅说TCP状态机制>,作者:云云生息 TCP(Transmission Control Protocol)是一种面向连接的.可靠的传输协议,常用于互联网中应用层 ...
- ulimit命令 控制服务器资源
命 令:ulimit功 能:控制shell程序的资源语 法:ulimit [-aHS][-c <core文件上限>][-d <数据节区大小>][-f <文件大 小 ...
- RDK新一代模型转换可视化工具!!!
作者:SkyXZ CSDN:SkyXZ--CSDN博客 博客园:SkyXZ - 博客园 之前在使用的RDK X3的时候,吴诺老师@wunuo发布了新一代量化转换工具链使用教程,这个工具真的非常的方便, ...
- Centos 7 安装Redis5 详细步骤 备忘录笔记
通过wget下载tar包 wget http://download.redis.io/releases/redis-5.0.5.tar.gz 解压包 tar -zxvf redis-5.0.5.tar ...
- 牛客题解 | 单组_spj判断YES与NO
题目 题目链接 解题思路 后台有spj代码,能对同学们的输出数据进行校验,符合条件即可通过. 附赠 spj 代码 #include <iostream> #include <fstr ...
- 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
现在使用Uni-app开发手机端APP已经变得很普遍,同一套代码就可以打包成Android App 和 iOS App,相比原生开发,可以节省客观的人力成本.那么如何使用Uni-app来开发视频聊天软 ...
- vmware workstation 17 pro激活密钥
vmware workstation 17 pro激活密钥,通用批量永久激活许可 17:JU090-6039P-08409-8J0QH-2YR7F 16:ZF3R0-FHED2-M80TY-8QYGC ...
- 【BUUCTF】Ping Ping Ping
[BUUCTF]Ping Ping Ping (命令执行绕过总结) 题目来源 收录于:BUUCTF GXYCTF2019 题目描述 提示较为明确,get方法传参127.0.0.1后结果如下 比较容易想 ...
- 执行shell脚本报错:Syntax error: word unexpected (expecting "in")
检查语法无误后,考虑是脚本文件换行符的问题. vs创建的文件默认以CRLF(0D0A)换行. 然而对于换行,windows用CRLF(0D0A)表示,linux用LF(0A)表示. 切换脚本文件换行符 ...