码迷,mamicode.com
首页 > 其他好文 > 详细

线段树

时间:2019-06-26 20:46:45      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:fine   信息   turn   sum   inf   维护   左右   struct   style   

线段树分块:

build()、ask()、change()、speard()、shrink()、

build()

建树:

void build(int p,int l,int r){
    /* 存节点左右中界 */
    l(p)=l,r(p)=r,mid(p)=(l+r)/2;
    if(l==r){/* 单节点信息 */return;}
    build(p<<1,l,mid(p));
    build(p<<1|1,mid(p)+1,r);
    /* 信息维护 */
}

speard()

标记下放:

void speard(int p){
    if(add(p)){
        /* 信息下放 */
        /* 标记下放 */
        /* 当前标记清零 */
    }
}

change()

修改区间:

void change(int p,int l,int r,ll d){
    if(l<=l(p) && r>=r(p)){
        /* 修改标记和整个节点信息 */
        return;
    }
    speard(p);
    if(l<=mid(p)) change(p<<1,l,r,d);
    if(r>mid(p)) change(p<<1|1,l,r,d);
    /* 信息维护 */
}

ask()

查询:

inf ask(int p,int l,int r){
    inf ans;
    /* ans初始化 */
    if(l<=l(p) && r>=r(p)){
        /* ans=当前节点信息 */
        return ans;
    }
    speard(p);
    if(l<=mid(p)){
        inf tmp;
        tmp=ask(p<<1,l,r);
        /* ans合并tmp信息 */
    }
    if(r>mid(p)){
        inf tmp;
        tmp = ask(p << 1|1, l, r);
        /* ans合并tmp信息 */
    }
    return ans;
}

shrink()

信息维护独立函数

 

板子:

const int N = 1000010;
struct SegmentTree {
    int l, r, mid;
    /* 信息 */
} tree[N * 4];

#define l(x) tree[x].l
#define r(x) tree[x].r
#define sum(x) tree[x].sum
#define add(x) tree[x].add
#define mi(x) tree[x].mi
#define mx(x) tree[x].mx
#define mid(x) tree[x].mid

void shrink(int p){
    /* 信息维护 */
}

void build(int p,int l,int r){
    /* 存节点左右中界 */
    l(p)=l,r(p)=r,mid(p)=(l+r)/2;
    if(l==r){/* 单节点信息 */return;}
    build(p<<1,l,mid(p));
    build(p<<1|1,mid(p)+1,r);
    /* 信息维护 */
}

void speard(int p){
    if(add(p)){
        /* 信息下放 */
        /* 标记下放 */
        /* 当前标记清零 */
    }
}

void change(int p,int l,int r,ll d){
    if(l<=l(p) && r>=r(p)){
        /* 修改标记和整个节点信息 */
        return;
    }
    speard(p);
    if(l<=mid(p)) change(p<<1,l,r,d);
    if(r>mid(p)) change(p<<1|1,l,r,d);
    /* 信息维护 */
}

inf ask(int p,int l,int r){
    inf ans;
    /* ans初始化 */
    if(l<=l(p) && r>=r(p)){
        /* ans=当前节点信息 */
        return ans;
    }
    speard(p);
    if(l<=mid(p)){
        inf tmp;
        tmp=ask(p<<1,l,r);
        /* ans合并tmp信息 */
    }
    if(r>mid(p)){
        inf tmp;
        tmp = ask(p << 1|1, l, r);
        /* ans合并tmp信息 */
    }
    return ans;
}

 

线段树

标签:fine   信息   turn   sum   inf   维护   左右   struct   style   

原文地址:https://www.cnblogs.com/rign/p/11093675.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!