假设有两个序列 A:a1,a2,...,an 和 B:b1,b2,...bn ,我们需要两个操作:
1.sum(i,j):计算ai,a(i+1),...,aj的和
2.range_add(i,j):range 修改[i,j]中的序列A,其中ai=ai+b1,a(i+1)=a(i+1)+b2,...,aj= aj+b(j-i+1)
是否可以进行 O(log n) 时间的操作?
一个简单的惰性传播树似乎无法解决问题,如果您将区间的总和存储在节点中,并使用序列 B 中的第一个加数来标记一个惰性修改的节点,因为当对一个节点进行修改时已经被标记了,你不能简单地把新的变化和之前的变化结合起来,你必须把之前的标签往下推,如果他们的孩子也已经被标记了,那么就需要更多的推送,导致总时间复杂度 O(n)。
也许我们可以将所有标签存储在一个数组中,并将当前节点的标签推到其子标签数组的后面,我想知道这个算法是 O(log n) 还是 O(n)?(应该是 O(n),因为我在 codeforces 中的提交失败了,所以我实际上想知道如何计算时间复杂度)
https://codeforces.com/contest/446/problem/C 这就是我的问题所在。