【C++】线段树模板(未完,待更新)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/u011956367/article/details/100809436

tips:由于时间关系,本帖暂未完善

线段树的结构

struct Node{
    int Left,Right,sum;//左右区间
    Node *LeftChild,*RightChild;//左右子树
};

线段树的创建

void build(Node *cur,int l,int r){
cur->Left=l;//左端点
cur->Right=r;//右端点
    if(l+1<r){//递归创建
	cur->LeftChild=new Node;
	cur->RightChild=new Node;
	build(cur->LeftChild,l,(l+r)/2);
	build(cur->RightChild,(l+r)/2,r);
    }else{//空
	cur->LeftChild=cur->RightChild=NULL;
    }
}

线段树的查询

int query(Node *cur,int l,int r){
    if(l<=cur->Left&&cur->Right<=r)
	return cur->sum;//区间覆盖
    else{
	int ans=0;
	if(l<(cur->Left+cur->Right)/2)
        ans+=query(cur->LeftChild,l,r);
        if(r>(cur->Left+cur->Right)/2)
        ans+=query(cur->RightChild,l,r);
        return ans;
    }
}

线段树的改变

void change(Node *cur,int x,int delta){
    if(cur->Left+1==cur->Right)
        cur->sum+=delta;
    else{
        if(x<(cur->Left+cur->Right)/2)
            change(cur->LeftChild,x,delta);
            if(x>(cur->Left+cur->Right)/2)
            change(cur->RightChild,x,delta);
            cur->sum=cur->LeftChild->sum+cur->RightChild->sum;
    }
}

猜你喜欢

转载自blog.csdn.net/u011956367/article/details/100809436