版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
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;
}
}