线段树

Posted rign

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线段树相关的知识,希望对你有一定的参考价值。

线段树分块:

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;

 

以上是关于线段树的主要内容,如果未能解决你的问题,请参考以下文章

一般线段树与权值线段树

详解权值线段树

权值线段树&&线段树合并

zkw线段树

权值线段树

#树# #线段树#