点差分
对于一组方向 ( s , t ) (s,t) (s,t) 点差分操作为:
d s ← ds \leftarrow ds← d s + k ds+k ds+k;
d t ← dt \leftarrow dt← d t + k dt+k dt+k;
d l c a ← d_{lca} \leftarrow dlca← d l c a − k d_{lca}-k dlca−k;
d f a ( l c a ) ← d_{fa(lca)} \leftarrow dfa(lca)← d f a ( l c a ) − k d_{fa(lca)}-k dfa(lca)−k;
其中 k k k 为 该变量;
边差分
同一位差分;
\\差分模板
void dfs(int u,int fath){
for \\ 前向行遍历
{
int v = e[i].to;
if(v != fath){
dfs(v,u);
chg[u] += chg[v]; // 注意是 u + v;
}
}
}
int main()
{
`````;
int lca = getlca(s,t);
chg[s]++,chg[t]++ , chg[lca]-=2; // 边差分;
chg[s]++,chg[t]++ , chg[lca]--,chg[fa[lca][0]]--; // 点差分;
}