算法训练--第五日日记

今日内容–线段树

(对于一个数,想将它乘以二就将其左移一位,再想加一就|1)
对于一个数组(大小为N),我们可以通过一个线段树数组(大小约为4N),用来存储其某段区间的信息,例如最大值,区间和。
通常会有build函数,用来建造线段树。

void build(int L, int R, int i) {
	tree[i].left = L;
	tree[i].right = R;
	if (L == R) {
		tree[i].sum = arr[L];
		return;
	}
	int mid = (L + R) >> 1;
	build(L, mid,i<<1);
	build(mid + 1, R, i << 1|1);
	pushup(i);
}

modify函数,修改区间信息。

void modify(int ji, int shu, int i) {
	if (tree[i].left == ji && tree[i].right == ji) {
		tree[i].sum += shu;
		return;
	}
	int mid = tree[i].left + tree[i].right >> 1;
	if (ji <= mid) modify(ji, shu, i << 1);
	else modify(ji, shu, i << 1 | 1);
	pushup(i);
}

query函数,返回区间信息。

int query(int L, int R, int i) {
	if (L <= tree[i].left && R >= tree[i].right) return tree[i].sum;
	int mid = tree[i].left + tree[i].right >> 1;
	int ans = 0;
	if (L <= mid) ans += query(L, R, i << 1);
	if (R > mid) ans += query(L, R, i << 1|1);
	return ans;
}

经典例题:修改单点信息,hdu-1166、最大区间和,SPOJ - GSS1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值