发现大多神犇的blog都没有讲清楚差分数组\(cf\)的定义,这里来强调一下。
假定:\(a_u\)表示\(u\)节点原来的权值,\(cf_u\)表示差分权值,\(s_u\)表示\(u\)节点的子树的差分之和,即\(s_u=d_u+\sum_{v=u.son}s_v\),但是由于我也不清楚\(cf\)的定义,于是我反着推了一下,便可以得到\(cf\)的定义:在一棵树上
\[a_u=cf_u+\sum_{v=u.son}s_v
\]
\[a_u=cf_u+\sum_{v=u.son}a_v
\]
\[cf_u=a_u-\sum_{v=u.son}a_v
\]
这里是假定我们求\(a_u\)的方式为\(cf_u+\sum_{v=u.son}s_v\),那么我们便得到了\(cf\)的定义。
那么我们如何更执行改操作呢?
如果我们要将\(u->v\)上的点全部加\(k\),那么由于\(u\)加了\(k\),那么\(cf_u\)也要加\(k\),由于\(u\)加了\(k\),那么\(cf_{fa_u}\)要减\(k\),但是又由于\(fa_u\)本身就要加上\(k\),所以节点\(fa_u\)等于不执行操作,以此类推,便可以得到
\[cf_u+k,cf_v+k,cf_{LCA(u,v)}-k,cf_{fa(LCA(u,v))}-k
\]
便可以完成更改操作了。
哟西~
浙公网安备 33010602011771号