树状数组三种写法

来源:互联网 发布:java enum if用法 编辑:程序博客网 时间:2024/05/10 14:20

第一种:点修改 区间求和

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;}

第三种:区间修改,区间询问

0 0
原创粉丝点击