📅  最后修改于: 2023-12-03 14:49:48.187000             🧑  作者: Mango
Fenwick树,也称为树状数组,是一种用于快速计算前缀和的数据结构。它允许在 $O(\log n)$ 的时间复杂度内实现单点修改和区间查询。本文将介绍如何使用Fenwick树从前缀求和数组中查找K的下界并进行更新,以及优化技巧和注意事项。
在前缀和数组中查找K的下界,即查找第一个大于等于K的值所对应的下标。我们可以利用Fenwick树的区间查询功能,找到第一个大于等于K的前缀和对应的下标。
具体实现如下:
以下为Python代码实现:
class FenwickTree:
def __init__(self, n):
self.n = n
self.tree = [0] * (n+1)
def update(self, i, x):
while i <= self.n:
self.tree[i] += x
i += i & -i
def query(self, i):
res = 0
while i > 0:
res += self.tree[i]
i -= i & -i
return res
def lower_bound(fenwick, val):
left, right = 1, fenwick.n
while left < right:
mid = (left + right) // 2
if fenwick.query(mid) >= val:
right = mid
else:
left = mid + 1
return left
def update_k(nums, k):
n = len(nums)
fenwick = FenwickTree(n)
for i in range(1, n+1):
fenwick.update(i, nums[i-1])
lb_idx = lower_bound(fenwick, k)
nums[lb_idx-1] = k
fenwick.update(lb_idx, k - fenwick.query(lb_idx-1))
本文介绍了如何使用Fenwick树从前缀和数组中查找K的下界并进行更新,讲解了其思路、代码实现、优化技巧和注意事项。Fenwick树是一种常用的数据结构,在算法竞赛和工程实践中广泛应用。