• 更新,线段树模板(支持相关基本操作)


    #define ls p<<1
    #define rs p<<1|1
    struct Seg
    {
        int p,l,r;
        ll sum,tag,mx;
    #define l(i) t[i].l
    #define r(i) t[i].r
    #define mx(i) t[i].mx
    #define tag(i) t[i].tag
    #define sum(i) t[i].sum
    }t[N<<2];
    
    void pushup(int p)
    {
        sum(p)=sum(ls)+sum(rs);
        mx(p)=max(mx(ls),mx(rs));
    }
    void pushdown(int p)
    {
        if(tag(p))
        {
            sum(ls)+=tag(p)*(r(ls)-l(ls)+1);
            sum(rs)+=tag(p)*(r(rs)-l(rs)+1);
            mx(ls)+=tag(p);mx(rs)+=tag(p);
            tag(ls)+=tag(p);
            tag(rs)+=tag(p);
            tag(p)=0;
        }
    }
    void build(int p,int l,int r)
    {
        l(p)=l;r(p)=r;
        if(l==r)
        {
            mx(p)=sum(p)=a[l];
            return;
        }
        int mid=l+r>>1;
        build(ls,l,mid);
        build(rs,mid+1,r);
        pushup(p);
    }
    void update(int p,int l,int r,ll d)
    {
        if(l<=l(p)&&r>=r(p))
        {
            sum(p)+=d*(r(p)-l(p)+1);
            mx(p)+=d;
            tag(p)+=d;
            return;
        }
        pushdown(p);
        int mid=(l(p)+r(p))>>1;
        if(l<=mid) update(ls,l,r,d);
        if(r>mid) update(rs,l,r,d);
        pushup(p);
    }
    void change(int p,int x,ll d)
    {
        if(l(p)==r(p))
        {
            mx(p)+=d;sum(p)+=d;
            return;
        }
        pushdown(p);
        int mid=(l(p)+r(p))>>1;
        if(x<=mid) change(ls,x,d);
        else change(rs,x,d);
       pushup(p); } ll query(
    int p,int l,int r) { if(l<=l(p)&&r>=r(p)) return sum(p); pushdown(p); int mid=l(p)+r(p)>>1; ll ans=0; if(l<=mid) ans+=query(ls,l,r); if(r>mid) ans+=query(rs,l,r); return ans; } ll ask(int p,int l,int r) { if(l<=l(p)&&r>=r(p)) return mx(p); pushdown(p); int mid=l(p)+r(p)>>1; ll ans=-0x3f3f3f3f3f3f3f3f; if(l<=mid) ans=max(ans,ask(ls,l,r)); if(r>mid) ans=max(ans,ask(rs,l,r)); return ans; }
  • 相关阅读:
    Ubuntu安装GTK+教程
    Qt 错误GL/gl.h: No such file or directory的解决方法
    Qt 解决Could not start process "make" qmake_all问题
    Feign解决服务之间调用传递token
    python闭包和装饰器
    python高阶函数
    ping 和 traceroute 的区别
    ICMP协议
    OSPF协议
    RIP协议
  • 原文地址:https://www.cnblogs.com/Suiyue-Li/p/11379748.html
Copyright © 2020-2023  润新知