树上差分
差分:
在我忘了哪年的NOIP题目——借教室中,由于一些选手的智(xia)慧(gao),出现了一种新的做法:前缀和差分。
举例来说,假设我们现在有一个长为\(n\)的数组,值初始为0,给出若干操作\([l,r]\),每次操作把区间\([l,r]\)的所有数加1,在执行所有操作后查询一次各点的值。
我们暂且不管线段树之流,如果只有一次操作,我们可以在\(O(1)\)时间内完成每次操作,在\(O(n)\)时间内完成最后的查询,方法是:我们对于每个操作,设定一个初始全部为0的S数组,对于每次查询\([l,r]\),我们执行\(S_l+1,S_r-1\),这样最后查询算出S数组的前缀和即可得出它的A值。
自此,差分成为一种鲜在正式书籍中出现的黑科技广泛流传,同理,它也可以被用来高效维护树上的某些数据。
树上差分:
假设我们把刚刚的序列操作放在树上,每次给出一组操作\([u,v]\),将从结点\(u\)到结点\(v\)路径上的所有点的权加1(初始为0),最后一次查询。
我们先将它变为有根树,每次操作时执行:$$A_u+1,A_v+1,A_{lca(u,v)}-2$$
然后我们定义一个结点的S值为:\(S_k=\sum_{v∈k.son}S_v+A_k\)
这样一个结点的S值就等于它与父亲连边被覆盖的次数
这样我们就可以在\(O(logn)\)的时间内完成单次操作,在\(O(n)\)时间内完成单次查询
一些例子:
NOIP2015 D2T3 运输计划 : http://www.cnblogs.com/Krew/p/5943570.html
Gym 100339 Diversion:
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号