mirror of
https://gitee.com/NorthCityChen/stl-go.git
synced 2025-05-25 20:11:08 +00:00
56 lines
951 B
Go
56 lines
951 B
Go
/*
|
|
* @Author: NorthCity1984
|
|
* @LastEditTime: 2022-04-26 17:08:18
|
|
* @Description: Binary Indexed Trees
|
|
* @Website: https://grimoire.cn
|
|
* Copyright (c) NorthCity1984 All rights reserved.
|
|
*/
|
|
|
|
package bit
|
|
|
|
type Number interface {
|
|
int | int64 | float32 | float64
|
|
}
|
|
|
|
type bit[T Number] struct {
|
|
array []T
|
|
brray []T
|
|
len int
|
|
}
|
|
|
|
func lowbit(x int) int {
|
|
return x & -x
|
|
}
|
|
|
|
// 初始化一个树状数组
|
|
func Init[T Number](array []T) bit[T] {
|
|
ret := bit[T]{
|
|
array: append([]T{0}, array...),
|
|
brray: make([]T, len(array)+5),
|
|
len: len(array),
|
|
}
|
|
|
|
for i := 1; i < len(ret.array); i++ {
|
|
ret.Add(i, ret.array[i])
|
|
}
|
|
return ret
|
|
}
|
|
|
|
// 在第x个数的位置+k
|
|
func (b *bit[T]) Add(x int, k T) {
|
|
for x <= b.len {
|
|
b.brray[x] = b.brray[x] + k
|
|
x = x + lowbit(x) // 父节点
|
|
}
|
|
}
|
|
|
|
// 求第一个数到第x个数的和
|
|
func (b *bit[T]) Ask(x int) T {
|
|
var ans T = 0
|
|
for x >= 1 {
|
|
ans = ans + b.brray[x]
|
|
x = x - lowbit(x)
|
|
}
|
|
return ans
|
|
}
|