2013THU集训Day1 楼房重建

博客讲述了如何解决一个关于楼房高度重建的问题,其中每天可以修改一栋房子的高度,目标是找出每天可以看到多少栋房子。通过分析问题,发现可以用线段树在O(Nlog^2N)的时间复杂度内解决,尽管常数较小,实现简洁。
摘要由CSDN通过智能技术生成

题意:

在x轴上有N栋房子,坐标为1~N。初始时每栋房子的高度为0(即还没建),之后有M天,每天可以修改一栋房子的高度。一个人站在原点向x轴正半轴看去,如果从原点到某栋楼楼顶的连线不与其他的楼相交,那么这人就看得到这栋楼。求每天可以看见几栋房子。N,M<=100000。


分析:

设第i栋房子的高度为a_i。如果一栋房子可以被看到,即其斜率a_i/i比其前面所有的房子的斜率都要大。那么现在问题变成了,每次修改一个数字,问此时有多少数字比之前的数字都要大。

一种比较显然的O(Nlog^2N)做法是用线段树套平衡树……但是写起来挺蛋疼。事实上我们可以只用线段树完成这个任务。

一个显而易见的结论是,这种数字的值是单调递增的。我们修改一个数只会对这个数后面的数造成影响。考虑线段树划分出来的若干线段。这里有两种情况:

1、某个线段中的最大值小于等于修改的数,那么这个线段的贡献为0,无需处理

2、否则我们将这个线段分成两个并单独考虑,如果左侧的最大值大于修改的数,那么是不影响右侧

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值