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

动态开点线段树

时间:2024-12-02 23:21:14浏览次数:3  
标签:int 线段 id sum 动态 节点

概况

背景

线段树,作为一种高级数据结构,其时间复杂度十分优秀。但有一个问题,就是需要的空间非常大,比如,现在给你一个长度为 1e9 的数组,让你在上面建立线段树。这种情况下连数组都开不了,更何况需要四倍空间的线段树呢。动态开点线段树就在这样的情况下出现了。

思路

顾名思义,动态开点线段树就是在需要的时候才建立某个节点,这省去了很多不必要的空间。

比如原来这样一个线段树,共开了 7 个节点

但我们只需要其中一部分,这样就只剩 3 个了。

代码

1.节点建立

点击查看代码
struct node{
    int sum,ls,rs;//ls是指左儿子,rs是右儿子,sum是数量和,也可以定义成别的
}t[N<<4];

2.单点加

点击查看代码
void add(int &id,int l,int r,int x,int val){
    if(!id)id=++idcnt;//动态开点
    if(l==r){
        t[id].sum++val;
        return;
    }
    int mid=(l+r)>>1;
    if(x<=mid)add(t[id].ls,l,mid,x,val);
    else add(t[id].rs,mid+1,r,x,val);
    t[id].sum=t[t[id].ls].sum+t[t[id].rs].sum;
}

其他的都和普通线段树差不多,区间加的时候注意动态开店即可。

标签:int,线段,id,sum,动态,节点
From: https://www.cnblogs.com/WDY-Hodur/p/18582655

相关文章

  • 动态内存开辟实现通讯录
    调试的主函数test.h#define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>#include"contant.h"//#include"contant.c"voidmenu(){ printf("******************************\n"); printf("*****1.add2.del**\......
  • 权值线段树
    线段树这种数据结构一般用于区间操作的题目之中,比如区间修改或者区间查询,但当我们想要针对值的数量等信息时,就会用到权值线段树,其本质就是建立在桶上的线段树。其代码和普通线段树没有什么区别,但其功能有些不同:1.查询某个元素的排名:点击查看代码#definelsid<<1#definers......
  • 洛谷题单指南-线段树-P4513 小白逛公园
    原题链接:https://www.luogu.com.cn/problem/P4513题意解读:给定序列a[n],支持两种操作:1.查询区间[l,r]内的最大子段和2.将a[x]修改成s,输出其中每一个查询操作的结果。解题思路:区间问题依然想到线段树,问题主要在于线段树的节点要维护哪些信息:最直接的,肯定要维护节点所表示区间的......
  • 线段树学习笔记
    线段树学习笔记对线段树的介绍线段树是一种树形数据结构,属于二叉树一棵线段树的每个结点都可以用区间\([l,r]\)来表示。线段树的叶结点表示的区间为\([l,l]\)或\([r,r]\)。线段树支持单点修改,区间修改,区间和/区间最值等的查询。对于线段树的区间修改一般采用延迟修改方式线......
  • 带有多选和突出显示关键字的自定义下拉选择框(动态)
    本文是在上一篇的基础上改造成根据输入关键词动态筛选选项列表,然后实现多项选择并且关键词高亮。上一篇:带有多选和突出显示关键字的自定义下拉选择框(静态)>>带有多选和突出显示关键字的自定义下拉选择框:CustomDropdownSelectBoxwithMultipleSelectionandHighlighting......
  • el-tree 实现动态初始默认选中和全选
    <template><div><!--全选选择框--><el-checkboxv-model="checkAll":indeterminate="isIndeterminate"@change="handleCheckAllChange">全选</el-checkbox>......
  • FORTRAN动态数组分配失败导致运行时Access Violation
    上周写了个程序,大致结构是主程序调用多个模块中的例程。声明了一个动态数组,期望实现的功能是通过子程序读取文件数据,写入数组,然后通过该数组传出。该数组在主程序中声明如下:real(8),allocatable::array(:)在例程中声明如下:real(8),allocatable,intent(out)::array(:)由于......
  • 使用Function与BiConsumer动态获取与操作对象中的属性
    代码:packagecom.xxx.xxx.utils;importcom.alibaba.fastjson.JSON;importlombok.Data;importjava.util.function.BiConsumer;importjava.util.function.Function;/***函数测试*/publicclassTest{@DatapublicstaticclassTestObj{pri......
  • Linux C/C++编程之动态库
    【图书推荐】《LinuxC与C++一线开发实践(第2版)》_linuxc与c++一线开发实践pdf-CSDN博客《LinuxC与C++一线开发实践(第2版)(Linux技术丛书)》(朱文伟,李建英)【摘要书评试读】-京东图书(jd.com)10.4.1 动态库的基本概念动态库又称为共享库。这种类型的库的命名规则一般是libx......
  • 实现 Spring Boot 动态定时任务
    依赖: <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>o......