首页 > 其他分享 >动态开点线段树

动态开点线段树

时间:2022-10-24 19:35:12浏览次数:38  
标签:int 线段 mid build push 动态 void

普通的线段树是满二叉树,大小为\(4n\),在有些题目中无法满足空间限制,此时就需要用动态开点线段树去解决这个问题

0x01 口胡开始

我们是如何表示一个普通线段树的?
左儿子:p<<1
右儿子:p<<1|1
这样表示很方便,但是浪费了大量空间
那么如何节省空间呢 ?
不妨换一种方法来连结父亲和儿子 , 线段树归根究底是种树形结构 , 那么我们可以考虑使用图论中树的方法 , 对于一个节点用指针来记录左右儿子的编号 , 这样我们的空间就被节省到\(2n\)了

0x02 实现

代码实现上 , 其实和普通线段树相比是没有什么区别的
以洛谷模板 "线段树1" 为例 , 以下代码相信大家一看就明白了

build

void build(int &p,int l,int r){//注意p需要引用传递,因为你可能需要加入新节点
	if(!p) p=++tot;
	if(l==r)
	{
	        t[p].vis=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(t[p].lson,l,mid);
	build(t[p].rson,mid+1,r);
	push_up(p);
}

pushdown

void pushdown(int &p,int l,int r,int k)
{
	if(!p) p=++tot;
	t[p].vis+=(r-l+1)*k;
	t[p].tag+=k;
}

update

void update(int &p,int l,int r,int L,int R,int k)
{
	if(!p)
		p=++tot;
	if(L<=l&&R>=r)
	{
		push_tag(p,l,r,k);
		return;
	}
	push_down(p,l,r);
	int mid=(l+r)>>1;
	if(L<=mid)
		update(t[p].lson,l,mid,L,R,k);
	if(R>=mid+1)
		update(t[p].rson,mid+1,r,L,R,k);
	push_up(p); 
}

0x03 写在最后

这玩意单独用处并不大 , 但是它是主席树和线段树合并的前置知识

标签:int,线段,mid,build,push,动态,void
From: https://www.cnblogs.com/sheepcsy/p/16822505.html

相关文章

  • BZOJ 4373(算术天才⑨与等差数列-线段树+hash)
    Description算术天才⑨非常喜欢和等差数列玩耍。有一天,他给了你一个长度为n的序列,其中第i个数为a[i]。他想考考你,每次他会给出询问l,r,k,问区间[l,r]内的数从小到大排序......
  • CF438D(The Child and Sequence-线段树mod x)
    维护一个区间的和,支持单点修改,区间modx考虑a>x,时,amodx<a/2,否则a=x所以暴力维护就行了#include<iostream>#include<cmath>#include<algorithm>#include<cstdio>#inclu......
  • springboot~redis-cluster动态感应的配置
    redis-cluster是一个高可用,可分片的分布式redis集群解决方案,建议使用springboot2.3及以上版本的脚手架,如果是<2.3版本,你需要手动添加LettuceConnectionFactory来实现因为服......
  • vue中实现当前时间echarts图表时间轴动态的数据
    1<!--!废话不多说,直接看代码吧!-->2<template>3<divclass="">4<divclass="chart"ref="ref_chart"style="width:370px;height:250px;"></......
  • #yyds干货盘点# 动态规划专题:乘积为正数的最长连续子数组
    1.简述:描述给定一个长度为n的整数数组,请你找出其中最长的乘积为正数的子数组长度。子数组的定义是原数组中一定长度的连续数字组成的数组。数据范围:  ,数组中的元素满......
  • #yyds干货盘点# 动态规划专题:环形数组的连续子数组最大和
    1.简述:描述给定一个长度为  的环形整数数组,请你求出该数组的 非空 连续子数组 的最大可能和。环形数组 意味着数组的末端将会与开头相连呈环状。例如,对于数组 而言,......
  • 数据结构 数组动态数组
    数据结构:批量管理和维护数据。一维数组string[]Name=newstring[3];string数组存储的数据类型,Name数组名称new通过new操作符返回新数组对象string[3]定义数组的元......
  • 宋红康老师关于动态代理举例的代码理解
    packageproxy;importjava.lang.reflect.InvocationHandler;importjava.lang.reflect.Method;importjava.lang.reflect.Proxy;/**动态代理的举例*/interfaceH......
  • JS文件动态上传进度条
    原网站<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport......
  • 动态代理
    动态代理为我们实现了方法增强功能。java的动态代理主要有jdk自带的动态代理和cglib动态代理。1、jdk动态代理需要根据接口实现,一个新实现该接口的代理类。2、cglib动态......