线段树模板求调
  • 板块学术版
  • 楼主clx201022
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/8/19 15:34
  • 上次更新2024/8/19 17:14:09
查看原帖
线段树模板求调
552688
clx201022楼主2024/8/19 15:34

题目 代码

struct Segment_Tree
{
    using ll=long long;
    struct node
    {
        std::unique_ptr<node>ls,rs;//指针 左右儿子
        int l1,r1;
        ll sum,plus_lz;
        node():ls(nullptr),rs(nullptr),l1(0),r1(0),sum(0),plus_lz(0){}//初始化
        void push_up()
        {
            sum=0;
            if(ls!=nullptr)
            {
                sum+=ls->sum;
            }
            if(rs!=nullptr)
            {
                sum+=rs->sum;
            }
        }
        void reset(int l_,int r_,const ll v[])
        {
            l1=l_;
            r1=r_;
            if(l1==r1)
            {
                sum=v[r1];
                return;
            }
            int mid=(l1+r1)>>1;
            ls=std::unique_ptr<node>(new node);
            ls->reset(l1,mid,v);
            rs=std::unique_ptr<node>(new node);
            rs->reset(mid+1,r1,v);
            push_up();
        }
        void push_down()
        {
            if(ls!=nullptr)
            {
                ls->sum+=plus_lz*(ls->r1-ls->l1+1);
                ls->plus_lz+=plus_lz;
            }
            if(rs!=nullptr)
            {
                rs->sum+=plus_lz*(rs->r1-rs->l1+1);
                rs->plus_lz+=plus_lz;
            }
            plus_lz=0;
        }
        void modify(int l2,int r2,ll v)
        {
            if(l2>r1||r2<l1)return;
            if(l2<=l1&&r1<=r2)
            {
                sum+=v;
                plus_lz+=v;
                return;
            }
            push_down();
            if(ls!=nullptr)ls->modify(l2,r2,v);
            if(rs!=nullptr)rs->modify(l2,r2,v);
            push_up();
        }
        ll query(int l2,int r2)
        {
            if(l2>r1||r2<l1)return 0;
            if(l2<=l1&&r1<=r2)return sum;
            ll ans=0;
            push_down();
            if(ls!=nullptr)ans+=ls->query(l2,r2);
            if(rs!=nullptr)ans+=rs->query(l2,r2);
            push_up();
            return ans;
        }
    }root;
    void reset(int l_,int r_,const ll v[])
    {
        if(l_>r_)std::swap(l_,r_);
        root.reset(l_,r_,v);
    }
    void modify(int l2,int r2,ll v)
    {
        if(l2>r2)std::swap(l2,r2);
        root.modify(l2,r2,v);
    }
    ll query(int l2,int r2)
    {
        if(l2>r2)std::swap(l2,r2);
        return root.query(l2,r2);
    }//接口
}t;
2024/8/19 15:34
加载中...