首页 > 其他分享 >P4198 楼房重建

P4198 楼房重建

时间:2024-03-23 20:57:53浏览次数:20  
标签:rsl cnt log 楼房 斜率 P4198 区间 重建

P4198 楼房重建

求从 \((0,0)\) 往上看能看到多少栋没被挡住的楼房,带修改。

对于带修改的题目,我们需要快速维护,就需要用到数据结构。这时候通过直觉可以想到,问题是可以分为子问题然后合并得到的,所以我们考虑线段树。

观察到能被看到的楼房,从左到右斜率递增,即我们需要维护斜率递增的序列。

考虑子区间需要维护的信息,发现该区间对其他区间的影响只跟其斜率最大值有关,所以一个是维护区间斜率最大值 \(\max\)。然后再维护一个区间答案 \(cnt\),表示从该区间的左端点能看到的楼房数量。

怎么合并?记 \(u\) 为合并后的区间,\(ls\) 和 \(rs\) 为左右区间。首先显然左区间 \(ls.cnt\) 一定能贡献到 \(u.cnt\) 中;右区间的答案显然不能马上得出,我们在把右区间细化成更小的问题,分类讨论一下。记右区间的左区间为 \(rsl\),右区间的右区间为 \(rsr\)。

如果 \(rsl.max<ls.max\),那么 \(rsl\) 所有点都看不到,舍去,然后继续考虑 \(rsr\)。

否则 \(rsr\) 的贡献只和 \(rsl.max\) 有关,可以发现贡献即为 \(rs.cnt-rsl.cnt\),然后继续考虑 \(rsl\)。

这部分思考变成代码也很简单,由于每次只会递归一个区间,复杂度单次是 \(O(\log n)\)。

所以是 update 的同时套一个 \(O(\log n)\) 的合并区间,总复杂度是 \(O(n\log^2 n)\)。

标签:rsl,cnt,log,楼房,斜率,P4198,区间,重建
From: https://www.cnblogs.com/FireRaku/p/18091667

相关文章

  • 楼房重建线段树
    link维护单调序列、点修的线段树。首先考虑一个楼房被看见的必要条件是前面没有斜率大于它的楼房,不等式可以推出来。然后本质上是维护一个从\(1\)号开始斜率单调上升的序列长度,注意,不能跳跃选择,即某栋楼房能加入序列则必须加入。线段树维护区间最大值和区间上升序列长度,由于......
  • 超分辨率(3)--基于RCAN网络实现图像超分辨率重建
    目录一.项目介绍二.项目流程详解2.1.数据处理模块2.2.损失函数设置 2.3.网络模型构建三.测试网络一.项目介绍RCAN:ResidualChannelAttentionNetwork(残差通道注意网络)卷积神经网络(CNN)的深度对于图像超分辨率(SR)是极其关键的因素。然而,我们观察到,更深层次的图......
  • P8626 [蓝桥杯 2015 省 A] 灾后重建
    根号分治之类的思路分析这里就不讲了,主要关注代码细节:#include<iostream>#include<stdio.h>#include<algorithm>#include<vector>#include<string>#include<cmath>#defineFor(i,j,n)for(inti=j;i<=n;++i)usingnamespacestd;co......
  • 406. 根据身高重建队列c
    /***Returnanarrayofarraysofsize*returnSize.*Thesizesofthearraysarereturnedas*returnColumnSizesarray.*Note:Bothreturnedarrayand*columnSizesarraymustbemalloced,assumecallercallsfree().*/typedefstructnode{inth......
  • 超分辨率(2)--基于EDSR网络实现图像超分辨率重建
    目录一.项目介绍二.项目流程详解2.1.构建网络模型2.2.数据集处理2.3.训练模块2.4.测试模块三.测试网络一.项目介绍EDSR全称EnhancedDeepResidualNetworks,是SRResnet的升级版,其对网络结构进行了优化(去除了BN层),省下来的空间可以用于提升模型的size来增强表现力。......
  • 406. 根据身高重建队列c
    折磨折磨,写错一个参数,找半天。/***Returnanarrayofarraysofsize*returnSize.*Thesizesofthearraysarereturnedas*returnColumnSizesarray.*Note:Bothreturnedarrayand*columnSizesarraymustbemalloced,assumecallercallsfree().*/int......
  • rpmdb 常用命令初始化与重建rpm数据库
    在Linux系统中,rpmdb命令用于初始化和重建rpm数据库。这里有一些常用的rpmdb方法:初始化RPM数据库:rpmdb--initdb这个命令会创建一个新的RPM数据库,如果数据库已经存在,它不会做任何事情。重建RPM数据库:rpmdb--rebuilddb如果RPM数据库损坏或者需要更新,这个命令会从已安......
  • oracle 控制文件重建
    3.5 恢复与重建3.5.1恢复控制文件方法控制文件一旦损坏,系统将不能正常工作。受损的控制文件会记录在告警日志中,恢复或重建控制文件必须使系统在NOMOUNT下1)单个文件损坏了:参照多元化章节,通过简单复制解决。2)所有的控制文件丢失:①如果有binary控制文件备份,利用备份恢复控制文......
  • (34/60)柠檬水找零、根据身高重建队列、用最少数量的箭引爆气球
    柠檬水找零leetcode:860.柠檬水找零贪心法思路遍历一遍数组,只关注面值5、10的钞票的数量每轮判断:如果是5,five++;如果是10,判断还有没有5,有的话five--;如果是20,检查有没有一张10、一张5,ten--,five--。或者三张5,five-=3。贪心:先消耗面值10的钞票,因为它更万能。复杂度分析时间......
  • 代码随想录算法训练营第三十四天| ● 860.柠檬水找零 ● 406.根据身高重建队列 ●
    柠檬水找零 题目链接:860.柠檬水找零-力扣(LeetCode)思路:注意对于20元的情况,有两种找零方式,            头一次见到这种情况,随便加一个标准输出才能通过的样例。classSolution{public:boollemonadeChange(vector<int>&bills){in......