线段树模板

线段树代码:

class Segment_Tree
{
    private:
    struct node
    {
        long long l, r;
        long long s;
        long long t;
    }tree[MAXN<<2];
    void push_up(long long n)
    {
        tree[n].s=tree[n<<1].s+tree[n<<1|1].s;
    }
    void push_down(long long n)
    {
        if(tree[n].t)
        {
            tree[n<<1].t+=tree[n].t;
            tree[n<<1|1].t+=tree[n].t;
            long long m=(tree[n].l+tree[n].r)>>1;
            tree[n<<1].s+=(m-tree[n<<1].l+1)*tree[n].t;
            tree[n<<1|1].s+=(tree[n<<1|1].r-m)*tree[n].t;
            tree[n].t=0;
        }
    }
    public:
    void buildtree(long long n, long long l, long long r, long long input[])
    {
        tree[n].l=l, tree[n].r=r, tree[n].t=0;
        if(l==r)
        {
            tree[n].s=input[l];
            return;
        }
        int m=(l+r)>>1;
        buildtree(n<<1, l, m, input);
        buildtree(n<<1|1, m+1, r, input);
        push_up(n);
    }
    void update_section(long long n, long long l, long long r, long long v)
    {
        if(tree[n].l>=l&&tree[n].r<=r)
        {
            tree[n].s+=(tree[n].r-tree[n].l+1)*v;
            tree[n].t+=v;
            return;
        }
        push_down(n);
        if(tree[n<<1].r>=l) 
            update_section(n<<1, l, r, v);
        if(tree[n<<1|1].l<=r) 
            update_section(n<<1|1, l, r, v);
        push_up(n);
    }
    long long search_section(long long n, long long l, long long r)
    {
        if(tree[n].l>=l&&tree[n].r<=r)
            return tree[n].s;
        push_down(n);
        long long c=0;
        if(tree[n<<1].r>=l) 
            c+=search_section(n<<1, l, r);
        if(tree[n<<1|1].l<=r) 
            c+=search_section(n<<1|1, l, r);
        return c;
    }
};
上一篇:configparser模块


下一篇:UITableView的性能优化10个小技巧