【线段树】高度封装的线段树基础模版、高扩展性的线段树打标记以及线段树二分模板----代码源dls的板子

本文详细介绍了线段树这一数据结构,包括其基本储存、实现方式、操作方法如build、change、query等,并展示了如何扩展线段树以存储更多信息,如区间最小值和出现次数。此外,还讲解了线段树的标记系统,如何进行区间修改和查询,并给出了线段树上二分查找的例子。内容深入浅出,适合对数据结构感兴趣的读者学习。

线段树

如果区间信息、标记能够快速合并,可以用线段树

基本储存及实现

储存

封装信息,用info记录存储的信息

后续给val赋值时可使用seg[i].val = {值1,值2…}的形式

typedef long long ll;
const int N = 201000;

struct info {
    int minv;
}
struct node {
    info val;
} seg[N * 4];

重载加号,确定信息修改规则

info operator + (const info &l, const info &r) {
    info a;
    a.minv = min(l. minv, r.minv);
    return a;
}

这样修改的时候只需要在info里增加变量,在重载里增加信息修改规则就可以了

操作

build() ---- 递归建树
//结点是id,区间是[l, r]
void build(int id, int l, int r) {
    if (l == r) {
        seg[id].val = {a[l]};
    } else {
        int mid = (l + r) / 2;
        build(id * 2, l , mid);
        build(id * 2 + 1, mid + 1, r);
        update(id);
    }
}

update() ---- 根据左

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喵寒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值