// 构建线段树
public void build(int node,int start,int end,int[] nums) {
if(start == end) {
segmentTree[node] = nums[start];
return;
}
int mid = (start + end) / 2;
build(2 * node + 1,start,mid,nums);
build(2 * node + 2,mid + 1,end,nums);
segmentTree[node] = segmentTree[2 * node + 1] + segmentTree[2 * node + 2];
}
// 改变数组值
public void change(int index, int val, int node, int start, int end) {
if(start == end) {
segmentTree[node] = val;
return;
}
int mid = (start + end) / 2;
if(index <= mid) {
change(index,val,node * 2 + 1,start,mid);
} else {
change(index,val,node * 2 + 2,mid + 1,end);
}
segmentTree[node] = segmentTree[2 * node + 1] + segmentTree[2 * node + 2];
}
//查询区间[L,R]的和
public int range(int left,int right,int node,int start,int end) {
if(left == start && right == end) {
return segmentTree[node];
}
int mid = (start + end) / 2;
if(right <= mid) {
return range(left,right,node * 2 + 1,start,mid);
} else if(left > mid) {
return range(left,right,node * 2 + 2,mid + 1,end);
} else {
return range(left,mid,node * 2 + 1,start,mid) + range(mid + 1,right,node * 2 + 2,mid + 1,end);
}
线段树模板【Java版本】
最新推荐文章于 2024-04-12 19:46:59 发布