首页 > 其他分享 >线段树模板

线段树模板

时间:2023-03-03 15:58:53浏览次数:32  
标签:std int res 线段 mid tl && 模板

struct SegmentTree {
    void pushUp(int u) {
        maxv[u] = std::max(maxv[u << 1], maxv[u << 1 | 1]);
    }

    void coverDown(int u) {
        if (lz1[u] != -1e14) {
            lz2[u << 1] = lz2[u << 1 | 1] = 0;
            lz1[u << 1] = lz1[u << 1 | 1] = lz1[u];
            maxv[u << 1] = maxv[u << 1 | 1] = lz1[u];
            lz1[u] = -1e14;
        }
    }
    void addDown(int u) {
        if (lz2[u]) {
            coverDown(u);
            lz2[u << 1] += lz2[u], lz2[u << 1 | 1] += lz2[u];
            maxv[u << 1] += lz2[u], maxv[u << 1 | 1] += lz2[u];
            lz2[u] = 0;
        }
    }
    void pushDown(int u) {
        // 1.将父节点的懒标记传递给子节点
        // 2.用更新后的子节点标记计算子节点所维护的信息
        // 3.将父节点懒标记清空
        coverDown(u);
        addDown(u);
    }

    void build(int u, int l, int r) {
        // 给标记赋予初始值
        lz1[u] = -1e14, lz2[u] = 0;
        if (l == r) {
            maxv[u] = a[l];
            return;
        }
        int mid = l + r >> 1;
        build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
        // 维护信息的更新
        pushUp(u);
    }

    // 区间修改操作
    void modify1(int u, int l, int r, int tl, int tr, int x) {
        if (l >= tl && r <= tr) {
            // 1.对该点的懒标记进行更新
            // 2.对该点所维护的信息进行更新
            // 注意标记的更新顺序,如果其他标记的存在会影响当前的更新,先进行 pushDown 操作
            lz2[u] = 0, lz1[u] = x;
            maxv[u] = x;
            return;
        }
        // 如果有懒标记的话在此处进行 pushDown 操作
        pushDown(u);
        int mid = l + r >> 1;
        if (tl <= mid) {
            modify1(u << 1, l, mid, tl, tr, x);
        }
        if (tr > mid) {
            modify1(u << 1 | 1, mid + 1, r, tl, tr, x);
        }
        // pushUp 更新所维护的信息
        pushUp(u);
    }
    void modify2(int u, int l, int r, int tl, int tr, int x) {
        if (l >= tl && r <= tr) {
            // 1.对该点的懒标记进行更新
            // 2.对该点所维护的信息进行更新
            // 注意标记的更新顺序,如果其他标记的存在会影响当前的更新,先进行 pushDown 操作
            coverDown(u);
            lz2[u] += x;
            maxv[u] += x;
            return;
        }
        // 如果有懒标记的话在此处进行 pushDown 操作
        pushDown(u);
        int mid = l + r >> 1;
        if (tl <= mid) {
            modify2(u << 1, l, mid, tl, tr, x);
        }
        if (tr > mid) {
            modify2(u << 1 | 1, mid + 1, r, tl, tr, x);
        }
        // pushUp 更新所维护的信息
        pushUp(u);
    }

    // 区间查询操作
    int query(int u, int l, int r, int tl, int tr) {
        if (l >= tl && r <= tr) {
            // 返回所查询的信息
            return maxv[u];
        }
        // 如果有懒标记在此处进行 pushDown 操作
        pushDown(u);
        int mid = l + r >> 1;
        int res = -1e17;
        if (tl <= mid) {
            res = std::max(res, query(u << 1, l, mid, tl, tr));
        }
        if (tr > mid) {
            res = std::max(res, query(u << 1 | 1, mid + 1, r, tl, tr));
        }
        return res;
    }
};

标签:std,int,res,线段,mid,tl,&&,模板
From: https://www.cnblogs.com/hacker-dvd/p/17175861.html

相关文章

  • js高德地图添加点Marker,添加线段Polyline,添加一个区域Polygon(面)
    高德地图JSAPI实例 亲测可用参考网站=>阿里云数据可视化平台(下载json用的):http://datav.aliyun.com/portal/school/atlas/area_selector?spm=a2crr.23498931.0.0.6859......
  • ssh框架整合模板
    Spring2.5+Hibernate3.3+Struts1.3整合开发struts-config.xml:<?xmlversion="1.0"encoding="utf-8"?><!DOCTYPEstruts-configPUBLIC"-//ApacheSoftwareFoundation//D......
  • 并查集模板
    #include<bits/stdc++.h>usingnamespacestd;intfa[10005];intm,n;intfind(intx){ if(fa[x]!=x){ fa[x]=find(fa[x]); } returnfa[x];}booljudge(intx,......
  • 区间DP模板
    区间dp一般都比较死板DP[i][len]表示从i开始,长度为len 区间dp通常数据N为300,400,500---几百的大小 for(intlen=2;len<=n;len++)for(inti=1;i+le......
  • Codeforces 438D The Child and Sequence 势能线段树
    势能线段树|拉线段树题单时发现的这道花神游历各国的骚操作至今让我印象深刻,原来有名字所谓势能,大意就是原本你在高空,操作一点下降一点,势能变少一点..当你落地时,修改......
  • 微信小程序:登录页面模板
    微信小程序:登录页面模板wxml:<viewclass="v1"><!--v2父容器子view使用绝对布局--><viewclass="v2"><viewclass="dltext">登录</view><!--......
  • 理解线段树这一篇文章就够啦!
    线段树TODO:补充例题线段树的进阶拓展\(Java\)模板封装类前言本文中,若无特殊说明,数列下标均从\(1\)开始由于本人实力有限,线段树更高级的拓展暂不做考虑引入......
  • 高精度-----大整数类模板
    代码如下#definemaxn100structBigint{ intlen,a[maxn];//用len记录位数,a记录每个数位 Bigint(intx=0){//通过初始化使得这个大整数能够表示整型x,默认为0 memset......
  • Codeforces Round #254 (Div. 1) C - DZY Loves Colors 线段树|lazytag维护区间加
    开一个变量维护同一个区间内颜色是否相同,而且显然要用lazytag了递归到颜色相同的区间时就可以直接打标记然后对于标记,维护的就是常规区间加的部分(最开始没写lazy,wa6,没明......
  • 程序设计竞赛算法与实现考点总结(模板)
    一,转换(星期计算)栗:给定一个日期,问这个日期是星期几?Mothod1---根据这个日期与今天的距离X,假设今天是星期Y,给定日期是今天星期之前:((Y-X)%7+7)%7+1;......