Link
Solution
对这个答案序列分块!!为什么我总是想把树分块。。。 想到这,接着就比较好说了。 修改一个点对块的影响,是使得它在块内的祖先的权值都相应变化。块内的祖先个数,可以地预处理出来。 这样整块的统计是的,那么零碎部分的也尽量,那就要求每个点的求值是的。显然常见套路树状数组做不到。 那么再用dfs序分块替代树状数组。同样支持区间修改,询问变成,修改。总复杂度就是了。
Code
1 |
|
对[1..n]这个答案序列分块!!为什么我总是想把树分块。。。 想到这,接着就比较好说了。 修改一个点对块的影响,是使得它在块内的祖先的权值都相应变化。块内的祖先个数,可以O(n√n)地预处理出来。 这样整块的统计是O(√n)的,那么零碎部分的也尽量O(√n),那就要求每个点的求值是O(1)的。显然常见套路树状数组做不到。 那么再用dfs序分块替代树状数组。同样支持区间修改,询问变成O(1),修改O(√n)。总复杂度就是O(n√n)了。
1 | #include "lucida" |