线段树(1)----- 简单问题 hdu4553

线段树是一种灵活的数据结构,所谓的灵活是因为他的以有很多的变形,而具体的变形却还是有规律可言的 - 

线段树是基于二分的,也就是可以在查找的时候优化复杂度为lgn ,而具体要考虑到的确是如何维护和通过维护什么来获得需要的结果;

1.求区间的最大值 

当然可以用RMQ来求解 ; 

线段树而言 : 考虑 , 对于区间的最大值,我们可以考虑,一个1~n的区间最大值a和1~n/2 与 n/2 ~ n的区间最大值b,c的关系  ;当然是a = max(b , c) ; 所以我们维护一个 max值t[i],每一次自顶向上pushup时 , t[rt] = max(t[rt<<1]  , t[rt<<1|1] ); 就很容易就可以有线段树的代码 ; 

2.求区间的和 

同理可以使用树状数组 ;

线段树方法 : 考虑相同 , a = b + c  ; 

所以维护一个sum ,,t[rt] = t[rt<<1] + t[rt<<1|1] ; 

以上两个通常用来优化复杂度 , 例如LIS 从 n^2 ---> nlgn ; 

3.区间查找问题  : 模拟计算机分配内存在一段内存中找到第一个长为len的空间并且占用 ; 类似于hdu4553

维护一个max[rt]表示这段连续内存内的最大空闲内存  , xdl[rt] 表示此段内的最左边的空闲内存的右端点 ; xdr[rt] 表示最右段的左端点 ; 

max[rt] = (xdl[rt<<1|1] - xdr[rt<<1] + 1 , max[rt<<1] ,  max[rt<<1|1] ) ;

xdl[rt]  和 xdr[rt]  也可以同样的维护 , 自己考虑; 


综上所述 : 线段树的所需数据的更新维护才是建树时因该考虑的重点因素 ; 

     但是,如何想到用线段树来解决才是ACMer的解体突破口,后者比前者更重要 ; 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值