线段树应用——动态开点

动态开点线段树是一种节省空间的计数问题解决方案,它仅在需要时构建子树。这种数据结构在初始阶段只有一个根节点,代表整个区间。当需要访问特定区间时,才创建相应节点。相比传统线段树,动态开点线段树不遵循二叉树的编号规则,而是使用变量记录子节点编号,并在递归中传递区间信息。单点修改操作可以通过调整实现,使得在动态开点线段树上进行区间最大值维护。经历m次单点操作后,节点数量规模为O(mlogn),最多有2n-1个节点。
摘要由CSDN通过智能技术生成

动态开点的引入

 在一些计数问题中,线段树用于维护值域(一段取值范围),这样的线段树也称为权值线段树。有些时候,为了降低空间复杂度,我们可以不建出整颗线段树的结构,而是在最初只建立一个根节点,代表整个区间,当我们需要访问线段树的某棵子树时(某个区间时),再建立代表这个子区间的节点。采用这种方法维护的线段树就称为动态开点的线段树。

动态开点线段树~!

 动态开点线段树抛弃了完全二叉树父子节点的2倍编号规则,改为使用变量记录左右子儿子节点的编号(相当于指针)。同时,它也不再保存每个节点代表的区间,而是在每次递归访问的过程中作为参数传递。下面是一个动态开点的线段树的节点编号。

struct SegmentTree{
   
	int lc,rc;//左右子节点的编号 
	int dat;//区间最大值 
}t[MAXM];

int root=0,tot=0;

inline int build(){
   //动态开点 
	tot++;
	t[tot].l=t[tot].r=t[tot].dat=0;
	return tot
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值