算法模板-树状数组
基本操作
树状数组 主要应用于单点修改和区间查询
核心操作就3个 lowbit \ add \ query
lowbit
lowbit 返回二进制最后一位的数1
2
3func lowbit(x)int{
return x & -x
}add
为某一个位置x 加上一个数v (如果是减的话可以减去这个数的负数)1
2
3
4
5
6
7
func add(x,v int){
for i:= x ; i <= n ; i+=lowbit(x){
tr[i] += v
}
}query
查询 1-x区间的数组和1
2
3
4
5
6
7func query(x int)int{
res := 0
for i:= x ; i > 0 ; i-=lowbit(x){
res += tri[i]
}
return res
}
树状数组例题整理
只要符合两个条件 就可以重点考虑使用树状数组 单点修改和区间查询
当然符合其中一个条件也可以 只是没那个必要 均有更好的替代方法
难度1: 模板题 (很久没写找找感觉用)
动态求连续区间和
原题链接:
https://www.acwing.com/problem/content/1266/
acwing上的题用go 会有些问题 尤其是那些输入输出复杂的最好还是用c++ 当然也只可能时创始人比较懒没有做好适配…
比如这题… 用go就会有换行问题 最后居然也会超时就比较离谱
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 niiish32x 's blog!