您的位置:首页 > 理论基础 > 数据结构算法

模板:(数据结构:线段树)

2014-08-01 00:27 190 查看
模板如下,注意数中对应的数组大小要为题目要求大小的4倍才可以保证不会RE

代码如下:

#include <cstdio>
#include <iostream>
#include <algorithm>
#define MAXN 50010
#define LL long long
using namespace std;

int sum[MAXN<<2];

void pushUp(int rt) {//当前根对应的值为左右孩子值之和
sum[rt] = sum[rt<<1]+sum[rt<<1|1];
}

void build(int l, int r, int rt) {//递归建树过程
if(l == r) {
scanf("%d", &sum[rt]);
return ;
}
int m = (l+r) >> 1;
build(l, m, rt<<1);
build(m+1, r, rt<<1|1);
pushUp(rt);
}

void update(int p, int add, int l, int r, int rt) {//单点更新,令p点对应值+add, l r表示左右边界, rt表示根节点
if(l == r) {
sum[rt] += add;
return ;
}
int m = (l+r) >> 1;
if(p <= m)
update(p, add, l, m, rt<<1);
else update(p, add, m+1, r, rt<<1|1);
pushUp(rt);
}

int query(int L, int R, int l, int r, int rt) {//统计L R之间的叶节点之和,l r表示左右边界, rt表示根节点
if(L<=l && r<=R)
return sum[rt];
int m = (l+r) >> 1;
int ret = 0;
if(L <= m)
ret += query(L, R, l, m, rt<<1);
if(R > m)
ret += query(L, R, m+1, r, rt<<1|1);
return ret;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: