HDU 4027 【线段树区间开根号】

本文介绍了如何在线段树中处理区间开根号的问题。通过分析,指出区间开根号不能像乘除那样一次性计算,但可以通过逐个操作在有限次数内达到目标。文章提到,对于不超过2^63的数,开根号最多进行63次,因此在10^5个数中,即使每个数都开根号,时间复杂度也是可接受的。实现时需要维护区间最大值和区间和,区间修改时遍历到叶子节点并更新相关信息。注意处理X > Y的情况,避免陷阱。
摘要由CSDN通过智能技术生成

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4027

这道线段树的题目我并没有按照线段树的模板写,这里把要点讲出来就行了。

第一:区间开根号不像区间乘或者除,能通过区间和然后一次性乘除求出一个区间的乘除,所以区间开根号只能一个一个的开,但是如果一个一个的开不会超时吗? 假设一个数在long long的范围里面,也就是2^63这个范围内,那么对这个数开根号最多要开几次? 63次。也就是说,开根号能够在很少的次数内,让一个数一直趋近于一个固定值1,这是区间开根号的一个突破口,只要知道当前这个区间的值都等于或者小于1,那就不需要对这个区间做开根号的操作了。虽然一个一个的开根号看似很费时,但是事实上是可行的,我们假设有 10^5(题目N的上限)个数,每个数都是2^63,每次都对整个区间开根号我们需要花费多少时间,因为线段树是一个把数组二叉树化的结构,所以每次访问一个数,需要log(N)的时间复杂度,有N个数,并且每个数最多开log(2^63)次,那么时间复杂度大约是 15*63*10^5;而且题目有说明,所有数的总和是不超过 2^63的,所以实际的时间复杂度还比上面说的要小很多;

所以具体的代码要怎么写?

首先需要一个记录区间最大值的数组,只要当前区间的最大值是小于或者等于1,那么就不用继续访问下面的节点了,因为1开根号仍然是1,这能为我们省下不少时间,其次是一个区间和的数组。

每次区间修改&#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值