洛谷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条羊肠小道,每条连接两座 ...
随机推荐
- .net core 用 identitymodel 请求token。
identitymodel 也有在Nuget里搜索和安装. identitymodel 扩展了HttpClient的一些方法用于token请求. 例如:client.RequestTokenAsyn ...
- Elasticsearch-总结列表
1.lucene基本概念 目前以 Lucene 为基础建立的开源可用全文搜索引擎主要是 Solr 和 Elasticsearch. Solr 和 Elasticsearch 都是比较成熟的全文搜索引擎 ...
- Superset实现动态SQL查询
使用自定义参数方式实现 superset 实现SQL动态查询 1.启用参数:config.py 设置"ENABLE_TEMPLATE_PROCESSING": True 2.当前s ...
- 解决安装python各种包速度慢问题
# 改用清华镜像库 pip install ******* -i https://pypi.tuna.tsinghua.edu.cn/simple
- C# mysql 带参数语句
带参数语句通常用于批量操作,例如批量插入. 截取一小段代码,修改后做一个简单的示例: 1. 表结构: CREATE TABLE `数据` ( `createtime` datetime NOT NUL ...
- java基础语法-package构造方法-继承-多态
java中的包 - package 包:包中有很多的类,根据类的功能不同,我们可以创建不同的包. 包的主要功能: 包的主要功能:用于分类管理 包的基本语法 package 包的路径(完整路径,从第一个 ...
- 虚拟化技术 - CPU虚拟化
本文分享自天翼云开发者社区<虚拟化技术 - CPU虚拟化>,作者:谢****悦 物理机器是由CPU,内存和I/O设备等一组资源构成的实体.虚拟机也一样,由虚拟CPU,虚拟内存和虚拟I/O设 ...
- 一键部署+限免体验!盘点如何在华为云上体验DeepSeek
本文分享自华为云社区<一键部署+限免体验!盘点如何在华为云上体验DeepSeek>,作者:华为云社区精选. 还在为DeepSeek深度思考出现"服务器繁忙"而头疼?华为 ...
- [WC2014] 紫荆花之恋 题解
啊啊啊啊啊啊啊啊啊啊啊我终于改完啦啊啊啊啊啊啊啊. 因为没有在最开始的时候将所有点设置为已经重构的,所以直接 \(R15-R70\) 间卡了两三天. 似乎也是我第一次大规模使用指针了. 这道题假如只有 ...
- EasyExcel合并行处理并优化
业务场景 由于业务需要导出如下图中订单数据和订单项信息,而一个订单对应多个订单项,所以会涉及到自定义合并行 1.简单处理项目使用的EasyExcel,经查找发现Excel种有个AbstractMerg ...