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

洛谷P4198 楼房重建 题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些事件发生在一个二维平面上.小A在平面上(0,0)点的位置,第i栋楼房可以用一条连接(i,0)和(i,Hi)的线段表示,其中Hi为第i栋楼房的高度.如果这栋楼房上任何一个高度大于0的点与(0,0)的连线没有与之前的线段相交,那么这栋楼房就被认为是可见的. 施工队的建造总共进行了M天.初始时…
题面 首先你要知道题问的是什么:使用一种数据结构,动态地维护以1为起点地最长上升子序列(把楼房的高度转化成斜率地序列)的长度: 怎么做?线段树! 我们在线段树上维护两个东西:1.这个区间内斜率的最大值 2.从这段区间开头可以看到的区间内的所有楼房 初始化:对于每一个叶子节点,从这段区间头可以看到的楼房数量一定为1,区间斜率最大值一定为该点的斜率: 在合并时: 1.我们可以先查找右区间的左区间的最大值,如果右区间的左区间的最大值比左区间的最大值小,那么右区间的左区间的所有答案一定看不到,所以我们就…
正解:单调栈+线段树 解题报告: 传送门! 首先考虑不修改的话就是个单调栈板子题昂,这个就是 然后这题的话,,,我怎么记得之前考试好像有次考到了类似的题目昂,,,?反正我总觉着这方法似曾相识的样子,,,想不起来辣,慢慢落实之前考题的时候再说趴QAQ 然后具体看到这道题的话,就是用个线段树,每个节点记录这个节点的最长序列和最大斜率 然后对于左右两个子节点合并 首先左节点直接保存下来就好 然后右节点,可以继续分半递归查找找到能合并的最左边节点 挺好理解的就是不太好表示,具体看代码算了QAQ 这样修改…
题意 题目链接 Sol 别问我为什么发两遍 就是为了骗访问量 这个题的线段树做法,,妙的很 首先一个显然的结论:位置\(i\)能被看到当且仅当\(\frac{H_k}{k} < \frac{H_i}{i}, k < i\) 考虑直接维护区间\([l, r]\)的可以被看到的点. 因为只有单点修改,因此只需考虑如何合并两个区间即可 维护区间内\(\frac{H_i}{i}\)的最大值,设其为\(mx\) 首先左孩子的答案可以直接加上,考虑左孩子对右孩子的贡献,如果\(mx_{ls} > m…
题意:给定序列,每次修改一个值,求前缀最大值的个数. 解:线段树经典应用. 每个节点维护最大值和该区间前缀最大值个数. 发现我们不用下传标记,只需要合并区间. 需要实现一个函数int ask([l r] lm)求出区间[l r]中前一个数是lm时前缀最大值个数. 那么当lm >= large[ls]时,return ask([mid r] lm) 这个很好理解,左子区间的所有数都不会成为前缀最大值. 当lm < large[ls]时,return ask([l mid] lm) + (sum[…
思路 此题可转化为以下模型 给定序列\(a[1...n]\),支持单点修改,每次求区间单调栈大小 \(n,Q\le 10^5\) 区间单调栈是什么呢?对于一个区间,建立一个栈,首先将第一个元素入栈,从左往右扫,如果当前元素大于等于栈顶元素,就将其入栈,由此形成的栈即为单调不减的区间单调栈. 转化一下,其实就是求区间内满足\(a[i]=\max\limits_{j=1}^ia[j]\)的\(a[i]\)的个数. 一个自然的想法是维护单调栈的大小\(siz\),那么如何去进行区间的合并呢? 合并两个…
P4198 楼房重建 题目链接 https://www.luogu.org/problemnew/show/P4198 题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些事件发生在一个二维平面上.小A在平面上(0,0)点的位置,第i栋楼房可以用一条连接(i,0)和(i,Hi)的线段表示,其中Hi为第i栋楼房的高度.如果这栋楼房上任何一个高度大于0的点与(0,0)…
P4198 楼房重建 集中写博客= = 首先把高度变成斜率 然后就比较玄学了,首先用线段树维护一个区间的斜率最大值,和只看这个区间时能看见的楼房个数ans 然后更新时先更新max,再处理神奇的ans 如果max[ls]>=max[rs],那么右区间都被遮住了可以不考虑,答案是ans[ls] 否则考虑右区间,写一个函数calc(x,h)表示x区间的最左边有一栋高h的楼房,此时x区间能看见几栋楼房,所以这时答案是ans[ls]+calc(rs,max[ls]) 然后下面是calc(x,h)的实现 如…
洛谷P1119-灾后重建 题目描述 给出\(B\)地区的村庄数NN,村庄编号从\(0\)到\(N-1\),和所有\(M\)条公路的长度,公路是双向的. 给出第\(i\)个村庄重建完成的时间\(t_i\),你可以认为是同时开始重建并在第\(t_i\)天重建完成,并且在当天即可通车.若\(t_i=0\)则说明地震未对此地区造成损坏,一开始就可以通车. 之后有\(Q\)个询问\((x,y,t)\),对于每个询问你要回答在第\(t\)天,从村庄\(x\)到村庄\(y\)的最短路径长度为多少.如果无法找到…
题目描述 从前,在一个王国中,在n个城市间有m条道路连接,而且任意两个城市之间至多有一条道路直接相连.在经过一次严重的战争之后,有d条道路被破坏了.国王想要修复国家的道路系统,现在有两个重要城市A和B之间的交通中断,国王希望尽快的恢复两个城市之间的连接.你的任务就是修复一些道路使A与B之间的连接恢复,并要求修复的道路长度最小. 输入输出格式 输入格式: 输入文件road.in,第一行为一个整数n(2<n≤100),表示城市的个数.这些城市编号从1到n.第二行为一个整数m(n-1≤m≤n(n-1)…