线段树
作者:
按时睡觉并不难
,
2024-10-16 10:35:42
,
所有人可见
,
阅读 2
//用子节点信息来更新当前节点信息(把信息往上传递)
public static void pushUp(int u)
{
tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum;
}
//在一段区间上初始化线段树,其中u表示根结点,l表示左边界,r表示右边界
public static void build(int u,int l,int r)
{
if(l == r) tr[u] = new Node(l,r,w[r]);
else
{
tr[u] = new Node(l,r,0);
int mid = l + r >> 1;
build(u << 1,l,mid);
build(u << 1 | 1,mid + 1,r);
pushUp(u);
}
}
//查询某段区间的和,其中u表示根结点,l表示左边界,r表示右边界
public static int query(int u,int l,int r)
{
if(tr[u].l >= l && tr[u].r <= r) return tr[u].sum;
int mid = tr[u].l + tr[u].r >> 1;
int sum = 0;
if(l <= mid) sum = query(u << 1,l,r);
if(r > mid) sum += query(u << 1 | 1,l,r);
return sum;
}
//修改操作,在u结点中,x位置加上v
public static void modify(int u,int x,int v)
{
if(tr[u].l == tr[u].r) tr[u].sum += v;
else
{
int mid = tr[u].l + tr[u].r >> 1;
if(x <= mid) modify(u << 1,x,v);
else modify(u << 1 | 1,x,v);
pushUp(u);
}
}