动态开点线段树

概况

背景

线段树,作为一种高级数据结构,其时间复杂度十分优秀。但有一个问题,就是需要的空间非常大,比如,现在给你一个长度为 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;
}

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

posted @   WDY_Hodur  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示