单点修改+区间查询
这是树状数组最基本的应用
转跳链接
poj 3321
题目要求
树上的单点修改和区间点权和
这里的区间求和是指子树(包括根)的所有结点权值和
单点修改为:1变0 0变1
参考AC代码
|
|
思路
由于是树上的树状数组问题 所以使用dfs序把树形结构转换为线性结构
维护两个时间戳in和out
注意开始时初始化均为1 利用vis数组可以快速判断执行+1操作还是-1操作
区间修改+单点查询
维护一个差分数组c[i]=a[i]-a[i-1]
如果想要修改a[i]到aj,只需令c[i]+=v,c[j+1]-=v
单点询问只需sum(c[i])即可
fzu 2277
转跳链接
由于此题没有初始数组(均为0) 所以只需要维护一个差分数组即可
tree1和tree2实际就是差分数组
若有初始数据可以利用change加到树中 也可以creat加入 也可以求前缀和+sum的结果避免插入操作
注意这里的out+1是建立在dfs里out为step-1的基础上
区间修改+区间查询
codeVS 1082
题目要求
区间修改+区间查询裸题
参考AC代码
|
|
思路
注意维护好tree2数组 开LL
二维树状数组
涉及到区间修改单点查询+单点修改区间查询
POJ 2155(区间修改单点查询)
题目要求
区间修改 矩形内0变1 1变0
问单点的值为多少
参考AC代码
|
|
思路
区间修改和一维树状数组一样 利用差分数组 注意修改的方式即可
本题记录的是修改的次数 偶数次修改不变 奇数次修改变位 所以最后答案%2即可
POJ 1195(单点修改区间查询)
题目要求
0表示初始化 3表示退出 1表示单点修改 2表示区间查询
参考AC代码
|
|
思路
裸题
注意树状数组的下标要从1开始 本题是从0开始所以所有的坐标都要+1
以及利用容斥对矩形查询的方式
HDU 1892(单点修改区间查询)
题目要求
S表示区间查询
A表示单点增加
D表示单点减少
M表示把点A的值移到点B上
参考AC代码
|
|
思路
同样这题的下标从0开始 所以+1
本题需要注意2个点的坐标无固定的大小关系 所以S操作要判断出谁是左上谁是右下
同样需要注意本题需要一个num数组用来存放每个点的值 为了在减少到0以下时值为0
最后注意memset不能赋1 以及初始化tree为1的快速方法