首页 > 其他 > 详细

线段树模板

时间:2019-04-03 22:54:22      阅读:145      评论:0      收藏:0      [点我收藏+]
int a[maxn];
struct Segment_Tree
{
    #define maxn 100005
    #define ls o<<1
    #define rs o<<1|1
    #define lss ls,l,mid
    #define rss rs,mid+1,r
    int tr[maxn<<2];
    //int lch[maxn],rch[maxn];
    int add[maxn];
    int sum[maxn];
    inline void pushdown(int o)
    {
        sum[o]=sum[ls]+sum[rs];
    }
    inline void maintain(int o,int l,int r)
    {
        int mid=l+r>>1;
        sum[ls]+=(mid-l+1)*add[o];
        sum[rs]+=(r-mid)*add[o];
        add[ls]+=add[o];
        add[rs]+=add[o];
        add[o]=0;
    }
    void build(int o,int l,int r)
    {
        if(l==r)
        {
            sum[o]=a[l];
            return ;
        }
        int mid=l+r>>1;
        build(lss);
        build(rss);
        pushdown(o);
    }
    /*
    int pos,val;
    void update(int o,int l,int r)
    {
        if(l==r)
        {
            sum[o]=val;
            return ;
        }
        int mid=l+r>>1;
        if(l<mid)
            update(lss);
        else
            update(rss);
        pushdown(o);
    }
    */
    int ul,ur,uval;
    void update(int o,int l,int r)
    {
        if(l>=ul&&r<=ur)
        {
            sum[o]+=(r-l+1)*uval;
            add[o]+=uval;
            return ;
        }
        if(add[o])
            maintain(o,l,r);
        int mid=l+r>>1;
        if(ul<mid)
            update(lss);
        if(mid<ur)
            update(rss);
        pushdown(o);
    }
    //区间查询
    int ql,qr;
    int query(int o,int l,int r)
    {
        if(l>=ql&&r<=qr)
            return sum[o];
        int ans=0;
        int mid=l+r>>1;
        if(ql<mid)
            ans+=query(lss);
        if(qr>mid)
            ans+=query(rss);
        return ans;
    }

};

 

线段树模板

原文:https://www.cnblogs.com/033000-/p/10652035.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!