第一种:点修改 区间求和
hdu1166
http://acm.hdu.edu.cn/showproblem.php?pid=1166
题意:N个营地,1..N,每个营地有一些人
两种操作:
1. 给某个营地加上或减去一些人
2. 询问一个区间的总人数
inline void add(int x, int value){
for (int i=x; i<=n; i+=lowbit(i)){
tree[i] += value;
}
}
inline int get(int x){
int ret = 0;
for (int i=x; i; i-=lowbit(i)){
ret += tree[i];
}
return ret;
}
第二种:区间修改,点询问
用类似前缀和的思想统计一个点的变化量,从而将第二种转化问第一种
可以发现,第二种的代码和第一种加减相反
hdu1556
http://acm.hdu.edu.cn/showproblem.php?pid=1556
题意:n个气球,每次给一个区间涂色,问最后每个气球被涂色几次
inline void add(int x, int value){
for (int i=x; i; i-=lowbit(i)){
tree[i] += value;
}
}
inline int get(int x){
int ret = 0;
for (int i=x; i<=n; i+=lowbit(i)){
ret += tree[i];
}
return ret;
}
第三种:区间修改,区间询问