首页 > 其他 > 详细

[动态开点线段树][学习笔记]

时间:2018-12-10 12:29:34      阅读:173      评论:0      收藏:0      [点我收藏+]

权值线段树

所谓权值线段树,就是指线段树内存的是权值。好像是废话。给出一些数,要查询一个区间内的数的个数。这时可以用权值线段树,开个n(n为给出的数的最大值)个点的线段树。然后就能轻松的维护了当然树状数组更简单

动态开点

为什么要动态开点呢?当然是因为空间不够啊。比如还是上面那个例子。加入给出的数的最大值为\(10^{12}\),并且无法离散化,显然空间开不下。那么就需要动态开点了。

思想

动态开点的思想就是,初始线段树只有一个根。当插入节点的时候在把那些需要的节点开出来。具体方法其实看一下代码就明白了。

void update(int &rt,int l,int r,int pos,int c) {
    if(!rt) {
        rt = ++num;
        tree[rt] = c;
    }
    tree[rt] = min(tree[rt],c);
    if(l == r) return;
    int mid = (l + r) >> 1;
    if(pos <= mid) update(ls[rt],l,mid,pos,c);
    else update(rs[rt],mid + 1,r,pos,c);
}

这就是插入的代码。注意在rt上面是有"&"的。其他的操作就和普通线段树一样了。

一道例题

hdu6183

题解

[动态开点线段树][学习笔记]

原文:https://www.cnblogs.com/wxyww/p/10095498.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!