线段树动态开点

线段树动态开点

核心思路

对于线段树这种暴力结构,其空间效率是比较底下的 O(4∗n) 。因此,我们想到一个方法来优化——动态开点。
也就是说,其实我们不需要一上来就把所有的节点全部建立起来,只需要在用到一个节点的时候再建立一个节点就可以了。

使用动态开点线段树的话,节点的下标将是无序的,因此必须建立结构体或用两个数组来分别保存一个节点的左右子节点

核心代码

int t[maxn<<1],lson[maxn<<1],rson[maxn<<1];//一个节点的值,一个节点的左儿子的下标,一个节点的右儿子的下标
int cnt;//用于记录已使用的节点的数量
inline void Pushup(int k){t[k]=t[lson[k]]+t[rson[k]];}
inline void update(int &k,int l,int r,int v,int x){
    /* 	函数功能:将数列中的第v个数修改为x
    	变量解释:&k:传入的数据是lson[k]或rson[k],如果对应的下标未确定,就
    	        将在这个函数中确定。为了能修改对应变量的值,此处要使用引用参数
    	        (其实指针参数也行,但是太麻烦)
    	        l:当前节点的左边界
    	        r:当前节点的右边界
    	        v:目标点的序号
    	        x:值    */
    if(!k)k=++cnt;//如上文所说,如果该节点不存在,就建立这个节点
    if(l==r){//找到目标节点
        t[k]=x;//修改值
        return;//返回
    }
    int mid=(l+r)>>1;//二分
    if(v<=mid)update(lson[k],l,mid,v,x);//更新左儿子
    else update(rson[k],mid+1,r,v,x);//更新右儿子
    Pushup(k);//自更新
}
inline int query(int k,int L,int R,int l,int r){
    /*  函数功能:查询数列中[L,R]区间内所有数之和
    	变量解释:k:从update()中可以知道,如果一个节点不存在,那么它的左右儿子
    			必然不存在,也就是说如果一个节点不存在,那它的值就是0而在查询时
    			不需要新建节点,所以此处的k不需要引用
    		    L、R:需要查询的区间[L,R]
    		    l、r:当前节点的区间[l,r]    */
    if(!k)return 0;//如上文,如果一个节点不存在就返回0
    if(L<=l&&R>=r)return t[k];//线段树知识
    int mid=(l+r)>>1;
    int ans=0;//返回值
    if(L<=mid)ans+=query(lson[k],L,R,l,mid);//查询左儿子
    if(R>mid)ans+=query(rson[k],L,R,mid+1,r);//查询右儿子
    return ans;
}

洛谷线段树模板1示例代码

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
typedef long long ll;
ll t[maxn<<1],lazy[maxn<<1];//因为是区间修改所以需要lazy
int lson[maxn<<1],rson[maxn<<1];
int cnt=1;
int n,m;
inline void Pushup(int &k){t[k]=t[lson[k]]+t[rson[k]];}
inline void Pushdown(int k,int l,int r){
    if(lazy[k]){
        if(!lson[k])lson[k]=++cnt;
        if(!rson[k])rson[k]=++cnt;
        //动态开点的Pushdown就这两句不一样——如果这个节点的子节点没有开,就把他申请开
        lazy[lson[k]]+=lazy[k];
        lazy[rson[k]]+=lazy[k];
        int mid=(l+r)>>1;        
        t[lson[k]]+=(mid-l+1)*lazy[k];
        t[rson[k]]+=(r-mid)*lazy[k];
        lazy[k]=0;
    }
}
inline void build(int &k,int l,int r,int v,int x){//用单点修改的方式来建树
    if(!k)k=++cnt;
    if(l==r)t[k]=x;
    else{
        int mid=(l+r)>>1;
        if(v<=mid)build(lson[k],l,mid,v,x);
        else build(rson[k],mid+1,r,v,x);
        Pushup(k);
    }
}
inline void update(int &k,int l,int r,int L,int R,int x){
    if(!k)k=++cnt;
    if(L<=l&&R>=r){
        lazy[k]+=x;t[k]+=(r-l+1)*x;
    }else{
        Pushdown(k,l,r);
        int mid=(l+r)>>1;
        if(L<=mid)update(lson[k],l,mid,L,R,x);
        if(R>mid)update(rson[k],mid+1,r,L,R,x);
        Pushup(k);
    }
}
inline ll query(int k,int l,int r,int L,int R){
    if(!k)return 0;
    if(L<=l&&R>=r)return t[k];
    Pushdown(k,l,r);
    int mid=(l+r)>>1;
    ll ans=0;
    if(L<=mid)ans+=query(lson[k],l,mid,L,R);
    if(R>mid)ans+=query(rson[k],mid+1,r,L,R);
    return ans;
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        int x;int temp=1;
        scanf("%d",&x);
        build(temp,1,n,i,x);
    }
    for(int i=1;i<=m;i++){
        int q;
        scanf("%d",&q);
        if(q==1){
            int L,R,x;
            scanf("%d%d%d",&L,&R,&x);
            int temp=1;
            update(temp,1,n,L,R,x);
        }else{
            int L,R;
            scanf("%d%d",&L,&R);
            printf("%lld\n",query(1,1,n,L,R));
        }
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/776813.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue的民族民俗文化分享平台-计算机毕业设计源码22552

基于Vue的民族民俗文化分享平台设计与实现 摘 要 本文介绍了一种基于Vue.js前端框架和Express后端框架的民族民俗文化分享平台的设计和实现。该平台旨在通过线上方式&#xff0c;促进民族民俗文化的传播与分享&#xff0c;增强公众对多元文化的了解和认同。 平台为普通用户提供…

谷粒商城学习笔记-14-项目结构创建提交到码云

一&#xff0c;码云上创建工程仓库 1&#xff0c;,点击右上角加号&#xff0c;选择新建仓库 2&#xff0c;填充必要信息 ①仓库名称&#xff0c;可以理解为工程名称。 ②仓库介绍&#xff0c;添加关于仓库的说明。 ③仓库权限设置&#xff0c;如果是公司项目&#xff0c;一般…

跨境电商入场第一步!先收集整理这些数据,看清自己该如何入场!【纯经验分享】

23年、24年确实无愧于“品牌出海元年”的称号&#xff0c;23年出海四小龙——速卖通、TikTokshop、Temu、Shein在海外的爆发让大家看到了海外市场的活动&#xff1b;而24年则有更多的国内品牌将目光瞄向了海外市场&#xff0c;年后开工到今天基本上每天都有客户来咨询出海相关的…

Spring Cloud 是什么?(Spring Cloud 组件介绍)

什么是 Spring Cloud&#xff1f; Spring Cloud 是微服务系统架构的一站式解决方案&#xff0c;是各个微服务架构落地技术的集合体&#xff0c;让架构师、 开发者在使用微服务理念构建应用系统的时候&#xff0c; 面对各个环节的问题都可以找到相应的组件来处理&#xff0c;比…

C语言中32位浮点数的格式

以 GNU C为例&#xff0c;它遵循 IEEE 754-2008标准中制定的浮点表示规范。在该规范中定义了 5种不同大小的基础二进制浮点格式&#xff0c;包括&#xff1a;16位&#xff0c;32位&#xff0c;64位&#xff0c;128位&#xff0c;256位。其中&#xff0c;32位的格式被用作标准 C…

springboot马拉松赛事志愿者管理系统-计算机毕业设计源码80251

摘 要 随着马拉松运动的兴起和发展&#xff0c;马拉松赛事的组织和管理面临着越来越多的挑战&#xff0c;其中志愿者的招募、培训和管理是至关重要的一环。传统的人力资源管理方式已经无法满足大型马拉松赛事对志愿者团队的需求&#xff0c;因此基于现代信息技术的马拉松赛事志…

MongoDB如何安装并配置公网地址实现Navicat远程连接本地数据库

文章目录 前言1. 安装Docker2. 使用Docker拉取MongoDB镜像3. 创建并启动MongoDB容器4. 本地连接测试5. 公网远程访问本地MongoDB容器5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定TCP地址远程访问 前言 本文主要介绍如何在Linux Ubuntu系统快速部署MongoDB&#…

ssm“落雪”动漫网站-计算机毕业设计源码81664

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3论文结构与章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据新增流程 3.2.2 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.5本章小结 3 系统总体设…

开发必备基础知识【Linux环境变量文件合集】

开发必备基础知识【Linux环境变量文件合集】 在Linux系统中&#xff0c;环境配置文件用于定制用户的Shell环境&#xff0c;包括定义环境变量、设置命令别名、定义启动脚本等。不同的Shell&#xff08;如bash、zsh&#xff09;有着各自对应的配置文件。 .bashrc&#xff1a;每新…

使用myCobot280和OAK-D OpenCV DepthAI摄像头制作一个实时脸部跟踪的手机支架!

引言 由于YouTube和Netflix的出现&#xff0c;我们开始躺着看手机。然而&#xff0c;长时间用手拿着手机会让人感到疲劳。这次我们制作了一个可以在你眼前保持适当距离并调整位置的自动移动手机支架&#xff0c;让你无需用手拿着手机。请务必试试&#xff01; 准备工作 这次我们…

[FreeRTOS 基础知识] 互斥量 概念

文章目录 基础知识互斥量互斥量与信号量区别优先级反转优先级继承小结 基础知识 [FreeRTOS 基础知识] 信号量 概念 互斥量 互斥量&#xff08;Mutex&#xff0c;全称&#xff1a;Mutual Exclusion&#xff09;&#xff0c;在计算机科学中&#xff0c;是一种用于防止多个进程同…

C++20中的指定初始化器(designated initializers)

指定初始化器(designated initializers, 指定初始值设定项)语法如下&#xff1a;C风格指定初始化器语法&#xff0c;初始化数据成员的一种便捷方式 T object { .des1 arg1, .des2 { arg2 } ... }; T object { .des1 arg1, .des2 { arg2 } ... }; 说明&#xff1a; 1.每个指…

leetcode力扣_排序问题

215.数组中的第K个最大元素 鉴于已经将之前学的排序算法忘得差不多了&#xff0c;只会一个冒泡排序法了&#xff0c;就写了一个冒牌排序法&#xff0c;将给的数组按照降序排列&#xff0c;然后取nums[k-1]就是题目要求的&#xff0c;但是提交之后对于有的示例显示”超出时间限制…

竞赛 深度学习LSTM新冠数据预测

文章目录 0 前言1 课题简介2 预测算法2.1 Logistic回归模型2.2 基于动力学SEIR模型改进的SEITR模型2.3 LSTM神经网络模型 3 预测效果3.1 Logistic回归模型3.2 SEITR模型3.3 LSTM神经网络模型 4 结论5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 …

C++deque容器

文章目录 deque容器概念deque操作deque对象的带参数构造deque头部和末尾的添加移除操作deque的数据存取deque与迭代器deque赋值deque插入deque删除 deque容器概念 deque是双端数组&#xff0c;而vector是单端的。 deque头部和尾部添加或移除元素都非常快速, 但是在中部安插元…

Ros2中goal_handle状态SUCCEED及ACCEPTED及CANCLED在rclpy中的死循环(彻底解决版本)

承接上文&#xff0c;遇到了在动作通信开发中&#xff0c;使用rclpy编写代码进行feedback等操作&#xff0c;但所有逻辑均编写完后&#xff0c;却无法将goal_handle提交为succeed状态&#xff0c;之前的解决方案是更改自己重写的execute()函数名为my_execute()并且在提交SUCCEE…

树莓派学习笔记18:IIC驱动_PCA9685(16路舵机驱动模块)误发

今日继续学习树莓派4B 4G:(Raspberry Pi,简称RPi或RasPi) 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: ​ Python 版本3.7.3: ​ IIC驱动_PCA9685(16路舵机驱动模块) 文章提供测试代码讲解,整体代码贴出、测试效果图 目录 开启树莓…

ASP.NET Web应用中的 Razor Pages/MVC/Web API/Blazor

如果希望使用ASP.NET Core创建新的 Web 应用程序&#xff0c;应该选择哪种方法&#xff1f;Razor Pages还是 MVC&#xff08;模型-视图-控制器&#xff09;&#xff0c;又或者使用Web API Vue/React/......。 每种方法都有各自的优点和缺点。 什么是 MVC&#xff1f; 大多数服…

一款免费的PDF编辑软件,内置了OCR功能,识别效果好

主要是想分享给大家他的OCR功能&#xff0c;面对无法编辑的PDF或者图片&#xff0c;如何批量的转成文字或者带有格式的word文档&#xff0c;很多时候或者很多工具做的不理想&#xff0c;今天分享的这款工具应该是目前为止&#xff0c;我遇到的最好的批量OCR工具。他不是简单的O…

NASA和IBM推出INDUS:高级科学研究的综合大模型

在最近的一项研究中&#xff0c;来自美国宇航局和IBM的一组研究人员合作开发了一种模型&#xff0c;该模型可应用于地球科学&#xff0c;天文学&#xff0c;物理学&#xff0c;天体物理学&#xff0c;太阳物理学&#xff0c;行星科学和生物学以及其他多学科学科。当前的模型&am…