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. rabbitmq部署及配置与验证-copy

    1. 场景描述 朋友项目需要弄个测试环境,稍微帮忙了下,系统不复杂,但是需要自己安装mysql.Reids.Es.RabbitMq等,Mq主要用在同步用户信息与发送站内消息和短信上,RabbitMq以 ...

  2. java中属性和变量的区别与final和抽象类

    属性和变量的区别 变量必须要有初始值: 属性可以没有初始值: 变量的范围只在当前大括号内有效: 属性是对象在哪里使用就在哪里有效: 属性的作用范围要比变量的大一些 属性和变量 public class ...

  3. HTML布局常用标签——div和span

    HTML布局常用标签--div和span 在HTML的世界里,div和span是两位不可或缺的老朋友,它们虽然看似简单,却在网页布局和样式设计中发挥着举足轻重的作用.今天,我们就来聊聊这两位" ...

  4. CMW500 Bluetooth信令测试

    一.简介 R&SCMW500宽带无线通信测试仪是适用于射频集成和协议开发的通用测试平台,其内部集成RF功率计和带List模式的CW发生器,可以完成无线设备的快速校准:同时还集成了矢量信号分析仪 ...

  5. Luogu P11363 NOIP2024 树的遍历 题解 [ 紫 ] [ 树形 dp ] [ 组合计数 ] [ adhoc ]

    树上遍历:CCF 难得一遇的好题! 参考了洛谷的第一篇题解,所以思路会有点相似. 部分分 当 \(k=1\) 时,显然方案总数为 \(\prod_{i=1}^{n}(d_i-1)!\),因为进入一个子 ...

  6. 2025牛客寒假算法基础集训营1 (E)

    [!note] 比赛链接 https://ac.nowcoder.com/acm/contest/953231 A.茕茕孑立之影 题目标签 构造 数论 题目大意 找到一个数x,x和长度为n的数组中的数 ...

  7. 泰山派(Linux)播放音乐

    泰山派(Linux)录音/播放音乐 alsamixer ​ 声卡: ​ 播放:play(较详细),aplay 录音:arecord ​ 麦克风可用: Main_mic可用 录音(wav/mp3) ar ...

  8. intellij debug模式提示 Method breakpoints may dramatically slow down debugging 解决办法

    直接上图........ 点击图中按钮  或者 快捷键(Ctrl - Shift -F8 ) 出现下图  

  9. QT5笔记:9. QT的容器类

    QList 中存放对象指针,QVector直接存放对象,所以访问性能更高 QMap中key不可以重复,QMultiMap中key可以重复 QMap在内存中顺序存储,QHash不是顺序存储的(hash算 ...

  10. ServerMmon青蛇探针,一个超好用的服务器状态监控-搭建教程

    serverMmon(青蛇探针)是nodeJs开发的一个酷炫高逼格的云探针.云监控.服务器云监控.多服务器探针~. 在线演示:http://106.126.11.114:5880/ 主要功能: 全球服 ...