首页 > 其他分享 >线段树

线段树

时间:2023-01-20 12:44:22浏览次数:43  
标签:int max 线段 tr Ra sum

线段树是一种可以根据子问题解决父问题的数据结构

比如说

求一段区间的和(\(\sum_{i=L}^Ra_i=\sum_{i=L}^Ma_i+\sum_{i=M+1}^Ra_i\quad ,L\leq M<R\))

求一段区间的最大值(\(\max_{i=L}^Ra_i=\max(\max_{i=L}^Ma_i,\max_{i=M+1}^Ra_i)\quad ,L\leq M<R\))

可以用线段树维护的问题必须满足 区间加法 ,否则是不可能将大问题划分成子问题来解决的。

例题:

P3372 【模板】线段树 1 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

243. 一个简单的整数问题2 - AcWing题库

板子:

struct point{
    int l,r;
    i64 sum,add;
}tr[N*4];
void pushup(int u){
    tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum;
}
void pushdown(int u){
    auto &root=tr[u];
    auto &left=tr[u<<1];
    auto &right=tr[u<<1|1];
    if(root.add){
        left.add+=root.add;left.sum+=(i64)(left.r-left.l+1)*root.add;
        right.add+=root.add;right.sum+=(i64)(right.r-right.l+1)*root.add;
        root.add=0;
    }
}
void build(int u,int l,int r){
    if(l==r){
        tr[u]={l,r,a[l],0};
    }
    else{
        tr[u]={l,r};
        int mid=l+r>>1;
        build(u<<1,l,mid);
        build(u<<1|1,mid+1,r);
        pushup(u);
    }
}
void modify(int u,int l,int r,int d){
    if(tr[u].l>=l&&tr[u].r<=r){
        tr[u].sum+=(i64)(tr[u].r-tr[u].l+1)*d;
        tr[u].add+=d;
    }
    else{
        pushdown(u);
        int mid=tr[u].l+tr[u].r>>1;
        if(l<=mid)modify(u<<1,l,r,d);
        if(r>mid)modify(u<<1|1,l,r,d);
        pushup(u);
    }
}
i64 query(int u,int l,int r){
    if(tr[u].l>=l&&tr[u].r<=r)return tr[u].sum;
    pushdown(u);
    int mid=tr[u].l+tr[u].r>>1;
    i64 sum=0;
    if(l<=mid)sum=query(u<<1,l,r);
    if(r>mid)sum+=query(u<<1|1,l,r);
    return sum;
}

先鸽了以后再补充

标签:int,max,线段,tr,Ra,sum
From: https://www.cnblogs.com/liangqianxing/p/17062662.html

相关文章

  • 树状数组和线段树
    树状数组:简化线段树作用:单点修改,单点查询,区间查询,区间修改例题链接P3374【模板】树状数组1-洛谷|计算机科学教育新生态(luogu.com.cn)题目描述如题,已知一......
  • 数据结构 玩转数据结构 9-5 Leetcode上线段树相关的问题
    0课程地址https://coding.imooc.com/lesson/207.html#mid=13846 1重点关注1.1线段树区间查询见3.1  2课程内容  3......
  • 数据结构 玩转数据结构 9-4 线段树中的区间查询
    0课程地址https://coding.imooc.com/lesson/207.html#mid=13846 1重点关注1.1线段树区间查询见3.1  2课程内容  3......
  • 数据结构 玩转数据结构 9-3 创建线段树
    0课程地址https://coding.imooc.com/lesson/207.html#mid=13845 1重点关注1.1创建线段树见3.1 1.2代码如何引入方法见3.1 2......
  • 线段树学习笔记
    线段树简介线段树是一种基于分治思想的二叉树结构,用于区间信息统计线段树对比树状数组有如下好处:每个节点都代表一个区间具有唯一根节点,代表$[1,N]$每个叶子节点代......
  • 时间线段树(线段树分治)学习笔记
    时间线段树(线段树分治)学习笔记思想考虑如下问题:进行若干次操作,每次操作都在一个时间段内有效,也就是先被添加然后可能被撤销。同时还进行询问,对于每个时刻,输出所有操作的......
  • 线段树区间加、区间乘、区间推平、区间取相反数的通用处理办法
    首先声明:“通用”并不是万能,只是能维护这些操作下的大多数常见的区间信息。将数列中的每个元素视为一个一次函数\(f_i(x)=k_ix+b_i\)。假设数列为\(a\),则初始化\(f_i(x......
  • 线段树 复习笔记
    线段树是一类处理区间问题的优秀算法,通过用空间换时间来得到相对平均的复杂度。同时,也是一个OIer从萌新到提高的重要过渡。1.线段树的基本概念不难看出线段树是一棵......
  • 线段树优化建图学习笔记
    使用场景:单点向区间,区间向单点或区间向区间建边。实现原理:用线段树的一个节点管辖一段图上区间的顶点。实现步骤:将原图中的顶点拆点(理论上,实际代码中不需要),出点和入点......
  • 数据结构 玩转数据结构 9-1 什么是线段树
    0课程地址https://coding.imooc.com/lesson/207.html#mid=13843 1重点关注1.1线段树解决的问题墙体染色区间查询某区间天空天体数量 1......