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 的核心分类讨论:

  1. maxx<=lx ,结束
  2. a[l]>lx,这时候可以剪枝,直接返 \(len_x\)
  3. l==rreturn a[l]>lx
  4. 定义 \(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.编码的困难,调出来的错误

  1. 没有
  2. 有小的地方打错。

Part5.收获有什么

积累了这种类似的问题的解决方案,拿到这种修改查询的东西首先要理清楚自己要干什么,看他的等价问题是什么,然后思考是否可以合并,然后大胆假设,小心分讨!

Part6.时间主要花在哪里了

理解正解最后的减去和递归的pushup,这种还是见少了,要见多识广才能缩短时间。

洛谷P4198 楼房重建 题解的更多相关文章

  1. 洛谷 P4198 楼房重建 题解

    题面 首先你要知道题问的是什么:使用一种数据结构,动态地维护以1为起点地最长上升子序列(把楼房的高度转化成斜率地序列)的长度: 怎么做?线段树! 我们在线段树上维护两个东西:1.这个区间内斜率的最大值 ...

  2. 洛谷P4198 楼房重建 (分块)

    洛谷P4198 楼房重建 题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题, ...

  3. 洛谷P4198 楼房重建 单调栈+线段树

    正解:单调栈+线段树 解题报告: 传送门! 首先考虑不修改的话就是个单调栈板子题昂,这个就是 然后这题的话,,,我怎么记得之前考试好像有次考到了类似的题目昂,,,?反正我总觉着这方法似曾相识的样子,, ...

  4. 洛谷P4198 楼房重建(线段树)

    题意 题目链接 Sol 别问我为什么发两遍 就是为了骗访问量 这个题的线段树做法,,妙的很 首先一个显然的结论:位置\(i\)能被看到当且仅当\(\frac{H_k}{k} < \frac{H_ ...

  5. 洛谷P4198 楼房重建

    题意:给定序列,每次修改一个值,求前缀最大值的个数. 解:线段树经典应用. 每个节点维护最大值和该区间前缀最大值个数. 发现我们不用下传标记,只需要合并区间. 需要实现一个函数int ask([l r ...

  6. 洛谷 P4198 楼房重建

    思路 此题可转化为以下模型 给定序列\(a[1...n]\),支持单点修改,每次求区间单调栈大小 \(n,Q\le 10^5\) 区间单调栈是什么呢?对于一个区间,建立一个栈,首先将第一个元素入栈,从 ...

  7. 洛谷 P3905 道路重建 题解

    P3905 道路重建 题目描述 从前,在一个王国中,在\(n\)个城市间有\(m\)条道路连接,而且任意两个城市之间至多有一条道路直接相连.在经过一次严重的战争之后,有\(d\)条道路被破坏了.国王想 ...

  8. 洛谷 P4198 楼房重建 线段树维护单调栈

    P4198 楼房重建 题目链接 https://www.luogu.org/problemnew/show/P4198 题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上 ...

  9. 洛谷P1119-灾后重建-floyd算法

    洛谷P1119-灾后重建 题目描述 给出\(B\)地区的村庄数NN,村庄编号从\(0\)到\(N-1\),和所有\(M\)条公路的长度,公路是双向的. 给出第\(i\)个村庄重建完成的时间\(t_i\ ...

  10. 洛谷P2832 行路难 分析+题解代码【玄学最短路】

    洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...

随机推荐

  1. .net core 用 identitymodel 请求token。

    identitymodel  也有在Nuget里搜索和安装. identitymodel 扩展了HttpClient的一些方法用于token请求. 例如:client.RequestTokenAsyn ...

  2. Elasticsearch-总结列表

    1.lucene基本概念 目前以 Lucene 为基础建立的开源可用全文搜索引擎主要是 Solr 和 Elasticsearch. Solr 和 Elasticsearch 都是比较成熟的全文搜索引擎 ...

  3. Superset实现动态SQL查询

    使用自定义参数方式实现 superset 实现SQL动态查询 1.启用参数:config.py 设置"ENABLE_TEMPLATE_PROCESSING": True 2.当前s ...

  4. 解决安装python各种包速度慢问题

    # 改用清华镜像库 pip install ******* -i https://pypi.tuna.tsinghua.edu.cn/simple

  5. C# mysql 带参数语句

    带参数语句通常用于批量操作,例如批量插入. 截取一小段代码,修改后做一个简单的示例: 1. 表结构: CREATE TABLE `数据` ( `createtime` datetime NOT NUL ...

  6. java基础语法-package构造方法-继承-多态

    java中的包 - package 包:包中有很多的类,根据类的功能不同,我们可以创建不同的包. 包的主要功能: 包的主要功能:用于分类管理 包的基本语法 package 包的路径(完整路径,从第一个 ...

  7. 虚拟化技术 - CPU虚拟化

    本文分享自天翼云开发者社区<虚拟化技术 - CPU虚拟化>,作者:谢****悦 物理机器是由CPU,内存和I/O设备等一组资源构成的实体.虚拟机也一样,由虚拟CPU,虚拟内存和虚拟I/O设 ...

  8. 一键部署+限免体验!盘点如何在华为云上体验DeepSeek

    本文分享自华为云社区<一键部署+限免体验!盘点如何在华为云上体验DeepSeek>,作者:华为云社区精选. 还在为DeepSeek深度思考出现"服务器繁忙"而头疼?华为 ...

  9. [WC2014] 紫荆花之恋 题解

    啊啊啊啊啊啊啊啊啊啊啊我终于改完啦啊啊啊啊啊啊啊. 因为没有在最开始的时候将所有点设置为已经重构的,所以直接 \(R15-R70\) 间卡了两三天. 似乎也是我第一次大规模使用指针了. 这道题假如只有 ...

  10. EasyExcel合并行处理并优化

    业务场景 由于业务需要导出如下图中订单数据和订单项信息,而一个订单对应多个订单项,所以会涉及到自定义合并行 1.简单处理项目使用的EasyExcel,经查找发现Excel种有个AbstractMerg ...