`
hellojyj
  • 浏览: 61724 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

线段树区间更新

 
阅读更多
void build(int r,int L,int R)
{
    if(L==R) sum[1] = 1;
    else{
        int M = (L+R)/2;
        build(r*2,L,M);
        build(r*2+1,M+1,R);
        sum[r] = sum[r*2] + sum[r*2+1];
    }
}

void push_up(int r,int L,int R)
{
    if(lazy[r]>0)
    {
        sum[r] = lazy[r]*(R-L+1);
    }
    else
    {
        sum[r] = sum[r*2] + sum[r*2+1];
    }
}

void push_down(int r)
{
    if(lazy[r]>0)
    {
        lazy[r*2] = lazy[r*2+1] = lazy[r];
        lazy[r] = 0;
    }
}

void update(int r,int L,int R,int ql,int qr,int val)
{
    if(ql<=L&&R<=qr)
    {
        lazy[r] = val;
        sum[r] = val*(R-L+1);
    }
    else
    {
        int M=(L+R)/2;
        if(ql<=M) update(r*2,L,M,ql,qr,val);
        else push_up(r*2,L,M);
        if(qr>M) update(r*2+1,M+1,R,ql,qr,val);
        else push_up(r*2+1,M+1,R);
        
        push_up(r,L,M);
    }
}

void query(int r,int L,int R,int ql,int qr)
{
    if(lazy[r]>0)
        total += lazy[r]*(min(R,qr)-max(L,ql)+1);
    else if(ql<=L&&R<=qr)
        total += sum[r];
    else
    {
        int M = (L+R)/2;
        if(ql<=M)
            query(r*2,L,M,ql,qr);
        if(qr>=M)
            quert(r*2+1,M+1,R,ql,qr);
    }
}

 

分享到:
评论

相关推荐

    线段树区间更新code

    线段树区间更新代码线段树区间更新代码线段树区间更新代码线段树区间更新代码

    pascal区间线段树

    **Pascal 区间线段树详解** 线段树(Segment Tree)是一种数据结构,用于高效地处理数组或序列上的区间查询与修改操作。在Pascal编程语言中,我们可以使用记录(Record)类型来实现一个区间线段树。以下是基于给定...

    线段树六题

    - **线段树区间更新:** 由于车票的售出,区间内可用座位数会发生改变,需要在O(logN)的时间内完成更新操作。 - **线段树的懒惰传播机制:** 当需要更新的区间较大时,可以使用懒惰传播机制,先标记需要更新的节点,...

    线段树的一种实现

    线段树是一种高效的数据结构,常用于处理区间查询与更新问题。它的核心思想是将一个一维数组通过分治策略转化为一棵二叉树,每个节点代表一个区间的值,这棵树通常具有平衡性质,比如平衡二叉搜索树的特性。线段树在...

    点节点更新线段树

    其中,线段树(Segment Tree)是一种高效的数据结构,常被用于处理区间查询或更新的问题。在本篇文章中,我们将深入探讨“点节点更新线段树”的概念、原理以及实现细节,尤其关注单点更新操作。 ### 点节点更新线段...

    线段树完整版

    线段树是一种二叉树数据结构,常用于处理区间查询或区间更新的问题。它将一个线性序列分割成多个不连续的段,每一个节点代表一个区间,并且通过递归的方式将这些区间进一步分割为更小的子区间,直到每个叶子节点代表...

    几道经典线段树题目及代码

    4. 多次区间更新与查询:在一次运行中,可能有多个区间更新和查询操作,线段树可以很好地应对这种场景,只需保证每次操作后都更新线段树的状态。 5. 高级应用:线段树还可以与其他数据结构结合,解决更复杂的问题,...

    acm线段树基本

    线段树是一棵二叉树,每个结点表示一个区间。对于每个结点,左孩子结点表示左半区间,右孩子结点表示右半区间。每个结点还存储了该区间的总和信息。 线段树的构建 构建线段树的过程是递归的。从根结点开始,分裂...

    线段树.pdf

    例如,在处理动态的区间问题时,扫描线可以沿着线段树移动,实时更新或查询区间信息。 线段树作为一种基础且强大的数据结构,在信息学竞赛中使用频率很高,是算法竞赛选手必须掌握的技能之一。随着学习的深入,还...

    ZKW线段树模板类

    在进行区间更新时,只需更新相应节点及其子节点的值,而无需重新计算整个子树。 在ZKW_Segment_Tree.cpp和ZKW_Segment_Tree.h两个文件中,我们可以找到线段树模板类的实现。cpp文件通常包含了函数的具体实现,而h...

    线段树 二分 统计 ACM

    线段树通过“懒惰标记”技术优化了区间修改,避免了不必要的递归更新,提高了效率。 二分法,又称折半搜索,是一种在有序数组中查找特定元素的搜索算法。在线段树中,二分法可以用于定位区间操作的位置,例如在寻找...

    线段树与树状数组专题讲解

    5. **优势**:树状数组相比线段树,构造和更新操作通常更简单,但处理区间更新的能力稍弱,某些情况下不如线段树灵活。 两者对比: - **复杂性**:线段树和树状数组在操作复杂度上相同,都是O(logn),但在实现复杂...

    线段树高级数据结构实现

    线段树是一种高效的数据结构,常用于处理区间查询或区间更新的问题。它将一个线性序列分割成多个部分,每个节点代表一个区间的统计信息(如最大值、最小值、总和等)。通过构建线段树,可以快速地完成对区间的查询或...

    完全版线段树

    线段树的优化还包括懒惰标记(Lazy Propagation)技术,用于处理连续的区间更新,避免不必要的递归调用。此外,线段树还可以与其他数据结构结合,如splay树,以实现更快的查询和更新效率。 总的来说,线段树是一种...

    线段树——在ACM中制胜的法宝

    线段树——在ACM中制胜的法宝 线段树是一种非常重要的数据结构,广泛应用于算法竞赛(ACM)和...线段树可以高效地解决许多问题,如区间查找、区间更新、区间统计等,对于 ACM 的选手来说,掌握线段树是非常重要的。

    线段树学习步骤

    线段树是一种高效的数据结构,常用于处理区间查询和区间更新的问题。它的核心思想是将一个数组分成多个连续的子区间,并对每个子区间维护一个代表性的信息,从而实现快速查询和更新。以下是对线段树学习步骤的详细...

    线段树和树状数组讲解课件

    对于区间更新,可以通过“反向传播”的方式,将更新从目标位置向根位置逐级应用,同样保持了O(log n)的时间复杂度。树状数组的优点在于结构简单,易于理解和实现,但在某些特定问题上,如处理区间最值,其效率可能...

    线段树PPT两个,所有常规用法

    - 高效性:对于一个长度为n的区间,线段树可以在O(log n)的时间复杂度内完成查询和更新操作。 - 灵活性:线段树可以适应多种不同的区间操作需求,只需调整区间操作函数即可。 总结来说,线段树是一种强大的数据结构...

    几道经典线段树题目及代码2

    线段树是一种数据结构,主要用于高效地处理区间查询与区间更新问题。在计算机科学和算法竞赛中,线段树是解决动态区间问题的利器。它能够以近似于log n的时间复杂度完成对一个n元素数组的区间操作,其中n为数组大小...

    线段树

    线段树,是一种数据结构,主要用于高效地处理区间(或线段)上的查询与修改操作。在计算机科学中,线段树通常用于解决区间最值、区间加减、区间求和等问题,它通过将问题分解成更小的部分来实现快速响应。线段树的...

Global site tag (gtag.js) - Google Analytics